TThread Terminate()
-
ich habe mehrere Threads die Daten über eine Schnittstelle holen, speichern und auf der Hauptform anzeigen.
Wenn die Schnittstelle verbunden ist wird Resume() aufgerufen. Wird sie getrennt wird Suspend() aufgerufen.Muss ich dann überhaupt Terminate() aufrufen oder wird das nicht automatisch gemacht wenn ich die Hauptform schließe?
Ich habe folgenden Aufbau: Es gibt eine Hauptform. Für jedes Gerät kann von dort aus jeweils eine weitere Form geöffnet werden. In dieser Form wird der jeweilige Thread deklariert. Jeder Thread stellt auch eine Methode bereit mit der man das Gerät verbinden kann:
bool messgeraet1::PortOeffnen(AnsiString port) { connected = serialInterface->OpenComm(port, 19200, 100, 0, 0); if (connected) Resume(); else Suspend(); return connected; }
Hier meine Execute-Methode:
void __fastcall Messgeraet1::Execute() { while(!Terminated) { ErfasseWerte(); //hier werden die Daten von der seriellen Schnittstele geholt und gespeichert Synchronize(UpdateCaption); //hier werden die Daten auf der Hauptform angezeigt Sleep(1000); } }
Die Threads sind als auto_ptr deklariert, so dass ich mir das delete sparen kann.
Wann wird das Terminate() aufgerufen? Wenn die Hauptform geschlossen wird oder beim delete vom auto_ptr?
-
Zuerst guckst du mal hier:
docwiki.embarcadero.com schrieb:
Warnung: Die Methoden Resume und Suspend sollten nur für das Debuggen verwendet werden. Das Anhalten eines Threads mit Hilfe von Suspend kann zu Deadlocks und undefiniertem Verhalten in der Anwendung führen. Korrekte Thread-Synchronisierungen sollten mit TEvent und TMutex vorgenommen werden.
linopi schrieb:
Die Threads sind als auto_ptr deklariert, so dass ich mir das delete sparen kann.
Wann wird das Terminate() aufgerufen? Wenn die Hauptform geschlossen wird oder beim delete vom auto_ptr?Die Frage beantwortet ein Blick in den Quelltext ($(BDS)\source\rtl\common\Classes.pas oder so ähnlich):
destructor TThread.Destroy; begin if (FThreadID <> 0) and not FFinished and not FExternalThread then begin Terminate; if FCreateSuspended then Resume; WaitFor; end; ... end;