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?
Använder du ReaderWriterLock Class? ->Defines a lock that supports single writers and multiple readers
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?
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.
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.
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.
Ok, frågan löst alltså?
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.
Thread.sleep(1000) ?
inte ens det funkar tyvärr ^^
Använd aldrig sleep, det kallas Sloppy Programming!
ReaderWriterLock löser dina problem
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? ^^
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