Thread - Verständnis



  • Hallo,

    wenn ein Thread erzeugt wird, wird doch automatisch die Methode "Execute" aufgerufen.
    Frage: Wird dieser Thread, nachdem "Execute" abgearbeitet wurde, automatisch beendet, oder muss man am Ende von "Execute" einen Befehl (Terminate?) eingeben, um den Thread zu beenden?



  • Execute wird automatisch gestartet, wenn CreateSuspended als false angegeben wird!

    Bei CreateSuspended als true muss manuell gestartet werden - mit Resume() !!!

    Der Thread laeuft solange bis:

    a) Terminate gerufen wird
    b) Execute in einer Schleife laeuft

    !!!!!!!!!!!!!!!!!!!!
    In der Schleife MUSS eine Abfrage zu Terminated erfolgen. Wenn True, dann MUSS die Schleife beendet werden - das MUSS vom Programmierer so geschrieben werden.
    Anderenfalls wird der Thread nicht ordentlich beendet.
    !!!!!!!!!!!!!!!!!!!!

    Am Ende muss der Thread deletet werden, WENN FreeOnTerminate auf false steht!



  • Vielen Dank für die schnelle Antwort. Habe auch in der Hilfe in Zwischenzeit dazu mehr gefunden.

    Jetzt aber zu einem Thread-Problem:
    Ich erzeuge von meinem "Form1" aus einen neuen Thread:

    TPing *SecondProcess = new TPing(false);
    

    Unter "Execute" im Thread habe ich folgenden Code eingetragen, der einen Ping an einen Rechner im Netzwerk schicken und auswerten soll:

    try    //Ping an Rechner abschicken
       {
         while (!Terminated)
         {
           PingAntwortZeit = PingHost(Form1->aktuellerrechnername->Caption, NULL);
           //angepingter PC am Netz?
           if (PingAntwortZeit!=-1)    //wenn PC am Netz:
             Form1->aktuellerrechnerstatus->Caption="PC_im_Netz";
           else
             Form1->aktuellerrechnerstatus->Caption="PC_nicht_im_Netz";  //wenn nicht im Netz:
    

    Dabei wird auf die Form1-Komponente "aktuellerrechnername" und "aktuellerrechnerstatus" zugegriffen.
    1. Frage: muss man an dieser Stelle eigentlich auf Threadsicherheit achten (wie in der Hilfe beschrieben)? Wenn ja, wie realisiere ich diese Threadsicherheit?
    2. Frage: wie kann ich vom Form1-Quelltext aus vor der Erzeugung eines neuen Threads abfragen, ob noch ein vorher erzeugter Thread am laufen ist, um dann auf dessen Ende zu warten?



  • 1. Ja. Synchronize

    2. Mach ne Variable in Form1 die am Anfang von Execute gesetzt und am Ende (NACH Schleife) zurueckgesetzt wird.



  • Danke!!!

    Ich habe jetzt den Thread geändert, dass er einmal erzeugt wird und die Befehle unter Execute in einer While-Schleife immer wiederholt werden (bis terminated).

    Jetzt möchte ich den Thread im Quelltext von Form1 manchmal anhalten u. dann wieder weiterlaufen lassen.
    Mit folgendem Code erzeuge ich zu Beginn des Programms den Thread und starte diesen.

    TPing *SecondProcess = new TPing(true); // Thread erzeugen
     SecondProcess->Priority = tpLower; // niedrigere Priorität setzen
     SecondProcess->Resume(); // Thread jetzt ausführen
    

    Trage ich an einer anderen Stelle im Quelltext von Form1 ein

    SecondProcess->Suspend(); // PingThread jetzt anhalten
    

    dann bringt mir der Compiler die Fehlermeldung "Undefiniertes Symbol 'SecondProcess'".

    Wie muss ich denn den Suspend-Befehl realisieren???


  • Mod

    Hallo

    SecondProcess ist doch wohl eine lokale Variable

    Was kann man da tun (hat was mit *.h zutun)

    MfG
    Klaus



  • Ich habe aber bereits in der Unit von Form1 die Thread-Unit included.Innerhalb einer Methode von Form1 kennt er ja auch die Variable.
    Jedoch in einer eigens erstellten Funktion "void __fastcall NextPing()" erkennt er diese nicht, obwohl ich in der Form1.h unter public die Deklaration "void __fastcall NextPing(void)" eingetragen habe.



  • Du musst zunächst im Header von Form1 die Instanz "TPing *SecondProcess"
    erzeugen, somit ist der Objectzeiger im gesamten Code bekannt.
    In dem Header sollte auch noch eine vorward referenz "class TPing" mit eingefügt werden, damit der Datentyp TPing bekannt ist.
    Nun kannst du in deinem Code ein Object "SecondProcess = new TPing(true)"erzeugen.

    class TPing;           //vorward referenz 
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
      .......
               private:	// Anwender-Deklarationen
               TPing *SecondProcess;        //Instanz erzeugen
     .........
    };
    

    [/cpp]


Anmelden zum Antworten