Threads bei Programmende Löschen
-
Kevin Koel schrieb:
...Aber wird so auch wirklich der ganze Speicher wieder freigegeben? Immerhin wird der Thread ja nicht mittels delete gelöscht.
KevinIMHO, ja!
-
wird er imho nicht aber man kann ihn nicht mehr starten(über Resume() ), probier aber mal folgendes nach dem Terminate() :
MyThread->WaitFor(); //Wartet auf Beendigung des Threads delete MyThread;Setzt natürlich voraus das der Thread beendet wird wenn man Terminate() aufruft.
z.B. Mittels einer while(!Terminated) schleife
-
Hi,
ich habe in mein FormDestroy nun dies hier stehen:
void __fastcall TForm1::FormDestroy(TObject *Sender) { for (int i = 0; i < MyThreadList->Count; i++) { ((TMyThread*)MyThreadList->Items[i])->Terminate(); ((TMyThread*)MyThreadList->Items[i])->WaitFor(); delete ((TMyThread*)MyThreadList->Items[i]); } delete MyThreadList; }Hier ist das Problem, dass die Anwendung zwar beendet wird, weil sie nicht mehr zu sehen ist, aber anstelle des grünen Pfeils zum starten der Awendung im BCB wird immer noch der blaue Pfeil angezeigt. Anscheinend, werden die Threads nicht sofort beendet. Ich möchte diese aber sofort beenden und die Anwendung verlassen.
Kevin
-
Was genau steht denn in der TThread::Execute()?
Wie viele Threads startest Du?
Mit welcher Priorität laufen die Threads?Du kannst auch mal versuchen zuerst alle Threads zu 'suspenden' und dann gezielt einzelne weiter laufen zu lassen und zu terminieren:
Aus der Form::CloseQuery() in einem meiner Projekte:
bool DoClose = true; if (MyThreads) { try { TList* pList = MyThreads->LockList(); if (pList->Count) { if (Application->MessageBoxA("Abbrechen?", "Abbruchanforderung", MB_YESNO) == IDYES) { for (int i = 0; i < pList->Count; i++) { TTestThread* pThread = (TTestThread*) pList->Items[i]; if (!pThread->Suspended) pThread->Suspend(); } for (int i = 0; i < pList->Count; i++) { TTestThread* pThread = (TTestThread*) pList->Items[i]; pThread->Priority = tpNormal; if (pThread->Suspended) pThread->Resume(); pThread->Terminate(); Application->ProcessMessages(); pThread->WaitFor(); } DoClose = true; } else { DoClose = false; } } else { DoClose = true; } } __finally { MyThreads->UnlockList(); } } CanClose = DoClose;
-
Hi,
mein Thread Execute sieht so aus:
void __fastcall TMyThread::Execute() { AnsiString back; while(!Terminated) { back = GetValues(para); if (back == "ok") { Synchronize(AddValue); } else { Synchronize(AddError); } // Bis zum nächsten Seitenwechsel abwarten Sleep(int(random(8)+2)*1000); } }Ich führe permanent Berechnungen durch und speicher die in Variablen meines Formes.
Deinen Code kann ich nicht ganz nachvollziehen, erst pausierst du alle Threads und in der nächsten Schleife hast du wieder:
if (pThread->Suspended)
pThread->Resume();Wieso nicht die Threads direkt nach dem pausieren beenden?
Kevin
-
Weil die Threads, solange sie 'suspended' sind, nicht ausgeführt werden, also können Sie auch nicht 'terminated' werden...
Diese Vorgehensweise soll nur dafür sorgen, dass die Threads keine unnötige Rechenzeit mehr verbrauchen und der Thread, der gerade beendet werden soll, die maximal verfügbare Rechenzeit erhält.
-
Hi,
egal was ich mache, ich bekomme immer irgendwelche zugriffsverletzungen. Also immer wenn ich WaitFor mache kommt immer eine. Ich verzweifle langsam echt. Kann es vielleicht auch an meinem Execute liegen?
Oder das irgendwie das Form vor den Threads beendet wird? Habe echt keine Ahnung mehr.
Kevin
-
Wenn ich mich nicht irre, wird er Code
// Bis zum nächsten Seitenwechsel abwarten Sleep(int(random(8)+2)*1000);zuunterst in Deiner TMyThread::Execute() gar nicht ausgeführt, wenn Du das Formular zu machst und so das Programm terminierst. Kann sein, dass ich mich täusche und das nur dann der Fall ist, wenn man den Thread selbst gar nie explizit beendet. Aber ich erinnere mich, dass ich mal einen Breakpoint dort hinsetzte und der nie angesprungen wurde obschon das Programm korrekt beendet wurde... nur so als Hinweis...
- Adrian
-
Hi,
wie kann ich denn dann ein Sleep in der Execute Funktion reinmachen, also ein Sleep der geht? Vielleicht mit ein Syntesize?
Kevin
-
Gib mir mal Deine E-Mail-Adresse.
-
Joe_M. schrieb:
Gib mir mal Deine E-Mail-Adresse.
warum schreibst du es nicht einfach hier, damit es auch andere nutzen können?
-
Weil ich Dir ein kleines lauffähiges Projekt mailen wollte...