Kan det vara så att prestandan på din stationära är bättre/sämre och därför sker saker i en viss ordning där, men på den bärbara kanske det sker i en annan ordning? Ren gissning, jag sysslar sällan med trådar... Jag har en teori: Du har en loop som ligger och bränner upp processorn för att kolla din variabel. På din stationära har du dual core, och där märks det inte eftersom att båda trådarna kan köras parallellt. På din bärbara har du inte dual core, och där är det betydligt mer påtagligt? Visst är det så med processorerna kärnor. Skall kolla på tipset. Mycket tack! Istället för mePause har du en manualresetevent. Vid punkt 2, istället för att sätta mePause till true så anropas manualresetevent.reset(), trådb.start och till sist manualresetevent.waitone(). Tråd A börjar då vänta. Fungerar detta även om jag har flera "tråd A" snurrande? Pausar alla tråd A då ? Man kan lösa det på flera sätt, det sätt som jag kommer på rakt upp och ner är är att ha en long som tråd A räknar upp med System.Threading.Interlocked.Increment(). Sedan sätter den en resetevent så tråd B vaknar upp. Tråd b kollar då variabeln (long) med Interlocked.Read() (se dock till att reseta eventet _innan_ man kollar variabeln, risk för en låsning annars) för att se om alla tråd A har stannat. Om så inte är fallet så börjar den vänta igen.Tråd trubbel
Har en tråd som loopar ett jobb men skall upphöra om en parameter får ett visst värde.
När det värdet är uppnått skall en ny tråd startas .....
Funkar kanon på mina stationär maskiner. Men på min bärbara maskin stannar allt på precis när den andra tråden startats.
Ide?Sv: Tråd trubbel
Sv:Tråd trubbel
Den andra tråden väntar tills första stannat. När den andra tråden börjr med sitt så går det otroligt långsamt på min bärbara. På stationära går det som det är tänkt.Sv: Tråd trubbel
Titta på ManualResetEvent/AutoResetEvent istället, bättre än att loopaSv:Tråd trubbel
Public variabel lokaliserad i en modul
Tråd A:
Har en do while loop som gör lite jobb. Men hoppar över jobbet om mePause=true.
Tråd B:
Gör ett litet jobb
1 Tråd A startas från form X
2 Vid en knapp tryckshändelse i en from Y sätts variabeln mePause = true. Var efter Tråd B startas och gör sitt jobb. Återställer mePause=false
3 Tråd A fortsätter
Har inte kommit på hur jag skall kunna använda ManualResetEvent i min kod som grovt beskrivs ovan. Förslag?
Sv: Tråd trubbel
Innan tråd b dör så ska manualresetvent.set() anropas, varvid tråd a kommer fortsättaSv:Tråd trubbel
Innan tråd B går igång måste jag på något sett få reda på att alla "tråd A" har stannat. Hur gör man det?Sv: Tråd trubbel
För att pausa alla tråd A så är det inte värre än att alla väntar på samma resetevent.
Pseudo:
tråd A: Interlocked.Incerement(variabeln); reseteventPaused.Set(); reseteventwait.WaitOne();
tråd B: while(Interlocked.Read(variabeln)<antal_trådar_A) { reseteventPaused.WaitOne(); reseteventPaused.Reset(); } exekveraKod(); reseteventwait.Set();
Den som drar igång att tråd B ska exekvera osv. får se till att skapa alla resetevent, samt nollställa variabeln. (Obs! Endast _två_ resetevent, och reseteventWait måste vara av typen manualresetevent)