20. august 2007 - 00:27Der er
10 kommentarer og 1 løsning
Tjekke "Terminated" på aktuel tråd
Hej
Jeg har flere tråde som kalder den samme procedure. Noget i stil med:
T1, T2: TThread
T1.Execute begin DoSomeThing; end;
T2.Execute begin DoSomeThing; end;
procedure DoSomeThing; begin repeat SomeThing until "calling thread is terminated"
end;
Problemet er at jeg ikke ved hvordan man tjekker for om den tråd man er i, er Terminated. Jeg ved jo ikke hvilken tråd har kaldt min procedure.
Spørgsmålet går ud på hvordan jeg finder den tråd som har kaldt min procedure DoSomeThing (altså den aktive tråd) inde fra selve proceduren mens den kører
Jeg vil helst undgå at skulle sende pointere og variable ol. med til proceduren.
Terminated er en boolean der indikerer at der har været en forespørgesel om tråd afslutning. Når man kalder T1.Terminate (det vil man gør feks hvis program vil lukke ned, men vil vente til alle tråde er frigivet) så sættes terminated til True. Men hvis tråden er ved at køre en loop og ikke tjekker for om terminated er true, så får man bare et program der ikke svarer. Dvs et kald til Terminate afslutter ikke tråden med vold og magt, men blotter sætter et flag.
Det er gode forslag i kommer med here. Og jeg bruger lige nu noget der ligner det kroning skriver (jeg har en pointer som referere til terminated variablen, istedet for hele objektet, men er vel stortset det samme). Så jeg kan godt komme rundt om problemet.
Men selvom man kan løse problemet på mange måder, synes jeg det ville se bedst ud hvis man kunne finde ud hvilken tråd man kørte. Og det er også af "æstetiske" grunde jeg skrev, at jeg helst vil undgå pointere mm.
Jeg ved at der i delphi er functionerne GetCurrentThreadID og GetCurrentThread. Kan man bruge dem til at finde det aktuelle tråd ?
procedure TTestThread.Execute; var DontDie : boolean; begin inherited; DontDie := true; while DontDie do begin DontDie := fDieAt > now; if DontDie then sleep(0); end; end;
procedure TTestThread.Execute; var DontDie : boolean; begin inherited; DontDie := true; while DontDie do begin if assigned(fNotifyEvent) then fNotifyEvent(self); DontDie := fDieAt > now; if DontDie then sleep(0); end; end;
Det du har er en tråd der er tidsindstillet til at dø. Og så har du en event der sørger for at opdatere formen med hvilke tråde der kører. Har jeg forstået det rigtigt ?
Men jeg kan ikke se hvorfra man i en sub-proceudre vil kunne se om den kaldende tråd er "død" eller "levende" ? (hvilket er det som jeg skal bruge)
Og desuden så har jeg ikke bruge for at tjekke tråden inde fra execute. Det skal være inde fra en sub-procedure (DoSomeThing proceduren i exemplet)
Og forresten er sbMain.Panels[0].Text trådsikker, eller bruger du en anden sync/mutex der ikke fremgår af koden ?
Det kan godt være du skal pakke OnNotify ind i en Synchronize for at være sikker.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.