Thread beendet sofort in BCB2006



  • Hallo,
    ich benutze z.Zt. den Borland Developer 2006 und wollte einen Thread in meinem Prog. starten.
    Das Starten und dessen Aufgabe funktioniert auch, aber nach der Aufgabe wird der Thread sofort wieder beendet?
    Hier mein Code des Threads:

    //---------------------------------------------------------------------------
    
    __fastcall TmyThread::TmyThread(bool CreateSuspended)
    	: TThread(CreateSuspended)
    {
    FreeOnTerminate = true;
    Priority = tpNormal;
    }
    //---------------------------------------------------------------------------
    void TmyThread::SetName()
    {
    	THREADNAME_INFO info;
    	info.dwType = 0x1000;
    	info.szName = "ZeitThread";
    	info.dwThreadID = -1;
    	info.dwFlags = 0;
    
    	__try
    	{
    		RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD),(DWORD*)&info );
    	}
    	__except (EXCEPTION_CONTINUE_EXECUTION)
    	{
    	}
    }
    //---------------------------------------------------------------------------
    void __fastcall TmyThread::Execute()
    {
    	SetName();
    	//---- Thread-Code hier platzieren ----
    	Synchronize((TThreadMethod)&Zeitanzeige);
    }
    //---------------------------------------------------------------------------
    void __fastcall TmyThread::Zeitanzeige()
    {
    TDateTime Zeit = Now();
    FrmAuswahl->StatusBar1->Panels->Items[2]->Text = (String)Zeit;
    }
    

    Und so rufe ich Ihn in meiner Anwendung auf:

    void __fastcall TFrmAuswahl::Button1Click(TObject *Sender)
    {
    new TmyThread(false);
    }
    

    Das mit

    new TmyThread(false);
    

    ist ja nicht ganz richtig. Eigentlich sollte es ja heißen

    neuerThread = new TmyThread(false);
    

    aber das geht nicht. Er meldet "Bezeichner 'neuerThread' nicht bekannt.

    Was mache ich da falsch?



  • Hallo,

    Wenn schon, dann so

    TmyThread* neuerThread = new TmyThread(false);
    

    So würdest du eine lokale Variable deines Threads erzeugen.



  • Hi,
    habe den Fehler behoben. Aber der Thread stoppt immer noch direkt nach einmaliger Ausführung 😕



  • Hallo

    Wie wäre es denn mit einer Schleife:

    while(!Terminated)
    {
      Synchronize((TThreadMethod)&Zeitanzeige);
    }
    

    Gruss



  • Hallo,
    Das was ich über Threads gelesen habe, sagt aus, das ein Thread solange läuft bis er (vom User) beendet wird.
    Also ist doch so eine Schleife nicht gerade die beste Lösung.



  • Wieso denn nicht?

    Wenn der Thread gestartet wird, läuft er komplett durch und ist danach beendet.

    Du kannst den Thread natürlich z.B. mit einem Timer mit Resume wieder starten, oder Du lässt ihn solange arbeiten, bis er (durch den Benutzer) beendet wird und Terminated auf true gesetzt wird.

    In die Schleife muss sinnvollerweise noch eine Sleepfunktion oder ähnliches, da Du sonst Deine Rechnerperformance im Keller besuchen kannst.



  • Ich habe jetzt mal meinen Thread in eine Timer-Kompo. gepackt. Folgendes Problem ist aufgetreten: Wenn ich den Thread mit Resume im Timer wieder Starten will, bekomme ich die Meldung "Thread-Fehler: Das Handle ist ungültig(6)".
    Ist ja auch klar. Mein Thread wurde nach dem beenden ja wieder gelöscht...

    Also habe ich versucht, den Thread in der Timer-Kompo. mit

    ZeitThread = new TmyThread(false);
    

    immer wieder neu zu erstellen. Das klappt auch (fast).

    Jetzt tritt nämlich folgender Effekt auf, den man mit der Verwendung eines Threads natürlich verhindern will: Die Zeitanzeige gerät ins Stocken bei einer weiteren Aufgabe meines Programms 😞
    Das möchte ich doch mit einem Thread vermeiden...



  • Natürlich wird der Thread nach dem Beenden freigegeben. Du hast schließlich

    FreeOnTerminate = true;
    

    geschrieben.

    Wenn der Thread nur die Zeit mit den Sekunden anzeigen soll, dann schreibe folgendes in OnExecute:

    void __fastcall TmyThread::Execute()
    {
        SetName();
        //---- Thread-Code hier platzieren ----
        while(!Terminated)
          {
            Synchronize((TThreadMethod)&Zeitanzeige);
            Sleep(1000); // Thread wartet eine Sekunde
          }
    }
    

    Lies Dir am besten mal in der BCB Hilfe den Threadabschnitt durch. Besonders die Initalisierung mit Bool und die Eigenschaften

    Gruss



  • Nach langem suchen und lesen der BCB-Hilfe habe ich es dann auch so gemacht. Denn es steht '...ist der Codeblock in ::Execute() abgearbeitet, wird der Thread beendet...'.

    Mein Code sieht jetzt so aus :

    void __fastcall TmyThread::Execute()
    {
        SetName();
        //---- Thread-Code hier platzieren ----
        while(!Terminated)
          {
            Synchronize((TThreadMethod)&Zeitanzeige);
            Zeitanzeige();
          }
    }
    

    Nun wird der Thread beim Programmstart gestartet, die Zeit wird ständig aktuell angezeigt und beim Beenden des Programms wird der Thread mit

    TmyThread->Terminate();
    

    beendet. 👍

    Vielen Dank!!!


Anmelden zum Antworten