Threadanwendung beendet nicht richtig
-
hallo leute,
mein Thread "TDownload" wird in der Main wie folgt aufgerufen und beendet:
void __fastcall TForm1::Button3Click(TObject *Sender) { down = new TDownload(false); down->OnTerminate = DeleteThread; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { if (down) down->Terminate(); } //--------------------------------------------------------------------------- void __fastcall TForm1::DeleteThread(TObject* Sender) { down->Terminate(); //Der Thread wird terminiert und freigegeben (FreeOnTerminate). }
mein Thread selber ist eine while-Schleife die nach 6000 durchläufen beendet wird und gleichzeitig eine Funktion synchronisiert, die Form1->Caption benennt.
Sobald ich den Button in der Main gestartet habe und das Programm vor oder nachdem die threadexecute methode fertig gelaufen ist, kommen mehrere Fehlermeldungen:
Systemfehler Code 5. Zugriff verweigert
Code 1400 Ungültiges Fensterhandle
Zugriffsverletzung..
Abnormal Program Termination
kann mir jmd helfen ?
Gruß,
Gerhard
-
da stimmt sicherlich was nicht beim Synchronisieren. Poste doch mal den entsprechenden Teil.
greetz KN4CK3R
-
__fastcall TDownload::TDownload(bool CreateSuspended) : TThread(CreateSuspended) { FreeOnTerminate = true; } void __fastcall TDownload::GuiElements() { Form1->RadioButton2->Caption = "Datei manuell öffnen"; } //--------------------------------------------------------------------------- void __fastcall TDownload::Execute() { for (int i = 0; i < Form1->Memo2->Lines->Count; i++) { // { i++){ // 1; i++) { Memo2->Lines->Count Synchronize(&GuiElements); //mache irgendwas } }
-
1. In OnTerminate (-> DeleteThread - lustiger Name für eine Methode, die genau das nicht tut) nochmal Terminate() aufzurufen scheint mir nicht sinnvoll.
2. Du rufst beim Schließen des Formulars einfach Terminate() auf, ohne zu wissen, ob der Thread noch läuft. Wenn nicht, ist er schon gelöscht und es knallt.
3. Beim Thread erstellen läuft der Thread los und danach setzt du OnTerminate. Hier könnte der Thread aber bereits beendet und gelöscht sein. Starte den Thread lieber suspended, setze die Variablen und rufe danach Resume().
4. Prüfst du in Execute überhaupt auf Terminated? das ist die Voraussetzung dafür, dass der Thread auf Terminate() reagiert.