12 svar
131 visningar
Oskillz 15
Postad: 18 feb 2017 11:58

Flertrådning reader/writer - Vänta på att trådar ska bli klara

Hej, jag håller på med en uppgift i windows forms där jag har skapat en reader/writer med en delad buffer klass som håller en char. Jag har skapat trådar för readern och writern som synkroniserat läser och skriver till buffern, tanken är att en string ska läsas tecken för tecken av writern som skickar det till buffern och sen läses det av readern, det fungerar som det ska. 

Däremot så har jag en metod som ska visa om slutresultatet blev rätt, dvs om trådarna är synkroniserade (kan välja att köra osynkroniserat) och då vet jag inte hur jag ska göra för att vänta tills reader och writer trådarna är färdiga innan jag kallar på den metoden. Metodanropet ligger ju i samma click event som jag startar trådarna i. 

Såhär ser mitt click event ut i mitt main form:

private void StartTransferBtn_Click(object sender, EventArgs e)
{
if (!ReadDataToTransfer())
return;

StartTransferBtn.Enabled = false;
CreateWriterAndReaderObjects();

if (AsyncronousRadioBtn.Checked)
{
writer.Sync = false;
reader.Sync = false;
}
else
{
writer.Sync = true;
reader.Sync = true;
}


CreateAndStartWriterAndReaderThreads();

DisplayResultsWhenThreadsAreDone();
}

Har försökt att använda join på båda trådarna mellan metoden där jag startar trådarna och den som visar slutresultatet, men det låser hela applikationen. Någon som har nåt annar förslag på hur jag kan lösa detta?

PeterÅ 842
Postad: 18 feb 2017 13:08

Använder du ReaderWriterLock Class? ->Defines a lock that supports single writers and multiple readers

Oskillz 15
Postad: 18 feb 2017 13:15

Nej det gör jag inte, har bara skapat mina egna reader och writer klasser och synkroniserat trådarna som kör i den delade resursen. Hur använder man ett ReaderWriterLock objekt i detta fallet isåfall?

Oskillz 15
Postad: 18 feb 2017 13:30

Det jag vill göra är ju att vänta på att mina två trådar är färdiga innan jag anropar metoden som kollar om läs och skriv processen lyckades, dvs att writern inte skriver en ny bokstav i buffern förän readern har läst en och tvärt om så att resultatet alltid blir detsamma.

PeterÅ 842
Postad: 18 feb 2017 14:00

Jag känner inte till om du har några restriktioner på vad du får använda och vad du måste skriva själv. Om det fungerar, titta på ovanstående klass.

Oskillz 15
Postad: 18 feb 2017 14:18

Nä det är inga restriktioner på vad vi får använda, huvudsyftet är att vi ska kunna synkronisera trådarna och det har jag ju gjort.

PeterÅ 842
Postad: 18 feb 2017 14:24

Ok, frågan löst alltså?

Oskillz 15
Postad: 18 feb 2017 14:30

Nä det va inte det som va problemet, när jag kickar på en knapp så startar trådarna och gör det dom ska, skriver och läser, men i samma click event har jag i slutet en metod som ska anropas först när dom trådarna är klara, jag måste alltså säga åt main tråden att vänta med att köra den metoden tills dess att reader och writer trådarna har kört färdigt.

Henrik Eriksson 1405 – Fd. Medlem
Postad: 18 feb 2017 14:34

Thread.sleep(1000) ?

Oskillz 15
Postad: 18 feb 2017 14:41

inte ens det funkar tyvärr ^^

PeterÅ 842
Postad: 18 feb 2017 17:43

Använd aldrig sleep, det kallas Sloppy Programming!

ReaderWriterLock löser dina problem

Oskillz 15
Postad: 18 feb 2017 20:34

Jag har kollat på klassen men ser inte direkt hur jag ska använda den för att uppnå det jag är ute efter. Skulle du kunna ge mig en ledtråd? ^^

PeterÅ 842
Postad: 19 feb 2017 09:50 Redigerad: 19 feb 2017 09:52

Tror att detta är ett mer komplett exempel på vad du behöver titta på:

Se främst Example 2

https://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx

Svara Avbryt
Close