Thread Funktionen



  • Hallo,

    ich habe 3 Funktionen in meinem Thread.
    Die ersten beiden werden bei OnCreate benötig und die letzte beim Beenden.
    Nun meine Frage wie kann ich das machen?

    die ersten beiden ist nicht das problem

    //Thread-cpp
    void __fastcall TmyThread::Execute()
    {
            SetName();
            createMailslot(); //Mailslot öffnen
            Nachrichten();    //Nachrichten verarbeiten
    
            //---- Hier den Thread-Code plazieren----
    }
    
    //Form-cpp
    void __fastcall Tfrm_main::FormActivate(TObject *Sender)
    {
     //Thread starten
     cmsThread = new TmyThread(true);
     cmsThread->Resume();
    }
    

    beim Beenden müsste ich den Mailslot schließen dazu brauche ich die dritte Funktion.

    kann mir da jemand helfen 😕



  • Was heisst "werden bei OnCreate" benötigt? OnCreate wovon? Thread oder Form?

    -junix



  • Sorry..
    beim Formular (Tfrm_main::FormActivate)

    ich dachte das sieht man am Code 😕



  • Sei mir nicht böse, aber ich versteh immer noch nicht ganz... wie sagte Clippy in den Office XP werbeclips so schön? "try to rephrase your query" (o:

    -junix



  • Hallo 0Bytes,
    so richtig verstehe ich dein Problem nicht. Der Thread wird einmal durchlaufen und die Methode "createMailslot" scheint eine von dir geschriebene Methode zu sein. Daher nehme ich an du kannst vor dem Beenden auch den Mailslot schliessen nachdem du sichergestellt hast, dass der Thread durchlaufen ist und nicht z.B. in der Methode Nachrichten noch beschäftigt ist. Die Eigenschaft "Terminated" sollte dir über das Beenden des Thread Auskunft geben.

    Evi48



  • Moin

    ich hab es rausbekommen

    {
      SetName();
      //öffnet den Mailslot
      createMailslot();
    
      //Schleife läuft immer durch bis der 'Terminated' von FormClose kommt
      while(!Terminated)
      {
        DWORD dwBytesRead = 0;
        char sMsg[500];
    
        //Lese die nächste Nachricht aus dem Mailslot
        ReadFile(hMailslot, (LPVOID)&sMsg, 399, &dwBytesRead, NULL);
    
        //Nach ReadFile() enthält die Anzahl der gelesenen Zeichen.
        //Konnte keine Nachricht gelesen werden (weil z.B. keine geschickt worden ist,
        //enthält dwBytesRead() den Wert 0
        if(dwBytesRead > 0)
        {
          //Sicherstellen, dass der gelesene String mit einem Null-Zeichen endet
         sMsg[dwBytesRead] = '\0';
    
         AnsiString mail = sMsg;
         AnsiString mail1;
    
         int iPos1;
         int iPos2;
         //Position von '@' suchen
         iPos1 = mail.Pos('@');
         //Position von ']' suchen
         iPos2 = mail.Pos(']');
    
         AnsiString sModule;
         AnsiString sRechner;
         //Stringaufspaltung nach Modul
         sModule = mail.SubString(2, iPos1-2);
         //Stringaufspaltung nach Rechner
         sRechner = mail.SubString(iPos1+1, iPos2-iPos1-1);
         mail.Delete(1,iPos2);
         }
    
     }
     //wenn 'Terminated' von FormClose dann
     //Funktionsaufruf-Mailslot schliessen
     closeMailslot();
    }
    

    so funktionierts 🙂

    Dank Euch trotzdem 👍



  • *amkopfkratz* irgendwie krieg ich deine Problembeschreibung und deine Lösung nicht wirklich zusammen... naja wenigstens hats ja geklappt (was du auch immer wolltest *g*)

    -junix



  • Also zum Verständnis:

    Bei FormActivate wird der Mailslot zum Nachrichtenempfang geöffnet. Danach werden die ankommenden Nachrichten verarbeitet.
    Aber der Mailslot muss beim (z.B. Beenden der Anwendung, Threadbeenden) auch wieder geschlossen werden!
    Deshalb wird die Schleife so lange durchlaufen bis der Terminate() von der anwendung kommt. Die schleife wird verlassen und die closeMailslot() Methode wird aufgerufen.

    alles klar? 🤡


Anmelden zum Antworten