TThread gestartet?
-
Hallo Leute,
Wie kann ich am einfachsten erkennen, dass ein Thread überhaupt gestartet wurde?
Denn wenn er nicht gestartwet wurde und ichThread_p->WaitFor();
aufrufe, bleibt das Programm dort hängen...desshalb will ich so was:
if (Thread_p->Started) Thread_p->WaitFor();
Wie mach ich das am einfachsten?
Danke!
-
Hallo roN,
sieh doch mal in der Hilfe unter TThread bei den Eigenschaften__property bool Suspended = {read=FSuspended, write=SetSuspended, nodefault}; __property bool Terminated = {read=FTerminated, nodefault};
nach
Evi48
-
evi48 schrieb:
sieh doch mal in der Hilfe unter TThread bei den Eigenschaften [...] nach
haqb' ich natürlich,
Ich dachte auch ich mache es so:if(!Timer_TH->Terminated) Timer_TH->Terminate();
aber das hat der Compiler gar nicht gerne:
[C++ Fehler] MainForm.cpp(340): E2247 Zugriff auf 'TThread::Terminated' nicht möglichEdit:
Zitate bitte auf das Notwendigste beschränken. Danke!
-
k.A. Wieso die VCL Terminated als Protected (soviel mir war) deklariert. Hier wäre wohl die einfachste Lösung, das Property einfach nach "Public" als Readonly durchzurouten indem du ein nur Lese Property in deiner Ableitung deklarierst
-junix
-
Hi roN,
ich kenne dein Programm nicht aber nur nach Terminated abzufragen ist unter Umständen auch nicht der richtige Weg denn es gibt die Möglichkeit einen Thread zu suspendieren ohne ihn zu terminieren. Beide Eigenschaften sind meines Wissen nicht protected und ich habe keine Probleme darauf zuzugreifen. Ich mache das auf diese Weise im Destruktur der Klasseclass TSendFunk : public TThread // Den Thread stoppen if (Suspended) Resume(); // Ist der Thread suspendiert? if (!Terminated) // Ist der Thread bereits beendet? { SetEvent(Fu1Event[Thread_End]); // Ende Ereignis ausloesen WaitFor(); // Waretn bis der Thread beendet ist }
Evi48
-
evi48 schrieb:
Ich mache das auf diese Weise im Destruktur der Klasse
hm, OK aber Terminated ist auch false wenn der Thread gar nicht gestartet wurde=>Applikation bleibt genau gleich in der WaitFor()-Funktion hängen...
Edit:
Zitate bitte auf das Notwendigste beschränken. Danke!
-
@evi: du hast da non nen Hund drin: Suspends können verschachtelt werden. Hier wäre also eine While-Schleife und nicht ein if-zweig gefragt (o;
-junix
-
Hi Junix,
da lerne ich jetzt wieder was dazu. Ich bin davon ausgegangen ein Thread ist suspendiert oder nicht. Ist er suspendiert kommt das doch einem stop oder anhalten gleich?Evi48
-
Steht auch in der Doku zu Suspend() bzw. Resume():
Ein TThread kann grundsätzlich "mehrfach" suspendiert werden. Beispiel:
Du hast 3 Threads, A, B und C, wobei A und B Thread C beeinflussen. Nun kommt Thread A und Suspendiert C um einige Konfigurationsdaten zu ändern. Während diesen Änderungen kommt B und suspendiert den Thread nochmals um Eingangsdaten zu ändern. A ist aber jetzt fertig mit der Manipulation und ruft - während B noch Daten kopiert - Resume() auf. Wäre Suspend() nicht verschachtelbar hätte das fatale Folgen. Zum Glück allerdings wartet der Thread, bis B ebenfalls Resume aufruft und legt erst dann wieder los.
-junix
-
Ja prima danke das kann sicher mal helfen.
Evi48
-
Hm, aber habt' ihr noch einen Vorschlag wie ich um die Blockierung in WaitFor() herum komme?