![]() |
Thread Synchronisation/-steuerung
Hallo zusammen.
Man sollte ja meinen, dass zu diesem Thema schon alle gesagt wurde, aber die Sufu und google konnten mir nicht weiterhelfen. Ich habe eine Form, welche einen nicht suspendierten Thread erzeugt.
Delphi-Quellcode:
Dieser Thread hängt dann sofort an einem WaitForSingleObject. Wenn der Thread nun loslaufen soll, setzte ich einfach das Event:
procedure TForm3.FormCreate(Sender: TObject);
begin FmyThread := TMyThread.Create(false); end;
Delphi-Quellcode:
Nun soll der Thread
procedure TForm3.Button1Click(Sender: TObject);
begin FmyThread.EventRunThread.SetEvent; end; 1. von außen gestoppt werden können und 2. soll er sich unter bestimmten Bedingungen selbst stoppen können. In jedem Fall soll er meinem MainThread mitteilen dass er nun 'fertig' ist. Das wollte ich über Window Messages machen. Das Stoppen realisiere ich einfach so, dass ich das Event einfach resette. Ob nun von aussen, oder in Thread selber... Das Mitteilen an meinen MainThread mit einer WM bekomme ich für Fall2 hin. Aber wie mache ich das für den Fall 1?
Delphi-Quellcode:
const
WN_THREAD_FERTIG = WM_APP + 1; type TMyThread = class(TThread) private FEventLetThreadRun : TEvent; FHabGemerktIchMussAufhoeren: Boolean; FMainFormHandle: HWnd; protected procedure Execute; override; public property EventRunThread: TEvent read FEventLetThreadRun write FEventLetThreadRun; end; implementation procedure TMyThread.Execute; begin FEventLetThreadRun := TEvent.Create(nil, true, false, 'LetThreadRunEvent'); while not terminated do begin WaitForSingleObject(FEventLetThreadRun.Handle, INFINITE); // Thread Aufgaben // ... // FHabGemerktIchMussAufhoeren kann hier unter Umständen auf true gesetzt werden... if(FHabGemerktIchMussAufhoeren) then begin FEventLetThreadRun.ResetEvent; PostMessage(FMainFormHandle, WN_THREAD_FERTIG, 0, 0) end; end; end; Ist zumindest der Rest die richtige (threadsichere) Vorgehensweise? |
Re: Thread Synchronisation/-steuerung
Du kennst die Methode TEvent.Waitfor? Sieht irgendwie besser aus, als die Klasse zu verwenden und dann doch wieder auf die WinAPI umzusteigen. Im Hintergrund läuft dasselbe ab.
Edit: Und warum setzt du den Boolean-Wert nicht von außen. Nur dafür würde ich nicht mit Messages zum Thread anfangen. |
Re: Thread Synchronisation/-steuerung
Zitat:
Delphi-Quellcode:
FEventLetThreadRun.WaitFor(INFINITE);
Zitat:
Aber wie setzte ich die von außen threadsicher? Synchronize möchte ich nur ungern verwenden, da die Threads dann ja bei jedem Durchlauf Synchronisiert werden und mein zweiter Thread dann evtl. zwischendurch verzögert wird. Die Ausführung des zweiten Threads ist sehr zeitkritisch.... |
Re: Thread Synchronisation/-steuerung
Zitat:
|
Re: Thread Synchronisation/-steuerung
Für solche einfachen Flags braucht man nicht mal die. 8) Da ja nur ein Thread schreibt und einer liest, lassen sich bei einem 1-Byte-Boolean die normalen Operationen verwenden.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz