Erneuter Threadstart nach einmaliger beendung



  • Hallo zusammen

    ich habe ein kleines Problemchen.

    Ich habe hier einen Thread vom Typ CWinThread als Zeiger, den ich mit AfxBeginThread, CREATE_SUSPEND und m_bAutoDelete = FALSE starte

    so, wenn ich jetzt in eine Routine von mir reinlaufe, beende ich den vorerst

    ::WaitForSingleObject(m_pThread->m_hThread,INFINITE);
    

    dann tippe ich nen paar sachen und danach möchte ich den Thread wieder starten

    hab das dann auch wieder mit

    m_pThread->ResumeThread();
    

    versucht, aber irgendwie mach er mir das net

    könnte mir von euch bitte jemand sagen, wie ich das implementieren kann?

    Danke euch



  • Dann rufst Du halt nochmals AfxBeginThread auf.
    Wenn ein Thread *beendet* ist, dann ist er beendet (deshalb heist das wort ja so, oder)



  • Dir ist hoffentlich klar, daß WaitForSingleObject() den externen Thread NICHT beendet (das legt höchstens deinen Thread auf Eis, bis der andere fertig ist). Wenn du den Thread "nur" anhalten willst, ist das jedenfalls nicht der richtige Ansatz - also: Was genau hast du vor?



  • hi

    also

    der thread, von dem ich spreche, gibt nachrichten zurück, wenn ich an der seriellen schnittstelle daten empfange.

    dann bin ich in den code der nachricht reingegangen, muss da den thread anhalten, xyz andere zeilen ausführen und danach den thread wieder starten

    ich hatte da schonmal an sowas wie eine while schleife gedacht, aber das find ich irgendwie böse

    wie meinst du das, dass WaitForSingleObject das nicht tut? also ich hab mal debuggt und er läuft erst weiter, wenn in dem thread AfxEndThread aufgerufen wird



  • WaitForSingleObject() macht genau das, was der Name andeutet - es wartet darauf, daß ein Sync-Objekt aktiv wird (und ein Thread wird "aktiv", wenn er von sich aus fertig ist). (Randfrage: Wo genau hast du das eingebaut?)

    Für dich ist womöglich ein Ansatz mit Events am günstigsten - der Thread wartet, bis das Hauptprogramm den Event setzt:

    CEvent ev;
    
    //Thread
    while(!finished)
    {
      Recieve(msg);
      switch(msg.code)
      {
      case DATA_MESSAGE:
        ::SendMessage(parent,WM_THDATA);
        WaitForSingleObject(ev,INFINIE);
        break;
      ...
      }
    }
    
    //Hauptprogramm
    void OnThdata()//Verarbeitet WM_THDATA Nachrichten
    {
      ...
      ev.PulseEvent();
    }
    


  • also:

    in der OnInitDialog() starte ich den thread mit AutoDelete FALSE

    dann habe ich in der gleichen klasse die methoden zur bearbeitung der nachrichten implementiert.

    wenn jetzt nun nachricht xy gesendet wird von dem thread, geht er in die nachrichtenbehandlungsroutine rein, wo ich dann sofort einen schalter auf false setze, der im thread in einer while schleife abgefragt wird. sollte der auf false sein, geht er aus der schleife und führt mir den AfxEndThread aus

    so, nach setzen des schalters hab ich dann meine WaitForSingleObject mit den nötigen übergabeparametern

    wen ich haltepunkte setze, sehe ich, wie er aus der schleife gehtu nd AfxEndThread ausführt

    danach gehts weiter bei mir im Code

    und am ende der nachrichtenbehandlungsroutine setze ich den schalter wieder auf true und starte den thread wieder



  • In dem Fall sorgt aber nicht das WaitForSingleObject() dafür, daß sich der Thread beendet, sondern das "wo ich dann sofort einen schalter auf false setze" 😉 Mit dem WaitFor.. wartest du nur so lange, bis der Thread diesen Schalter wirklich bemerkt hat.

    btw, ist es wirklich unbedingt nötig, den Thread während der Nachrichtenverarbeitung komplett abzuschießen? Es dürfte wesentlich resourcenschonender sein, den Thread "nur" mit SuspendThread() einzuschläfern und später mit ResumeThread() wieder zu wecken.



  • achso

    dann würde ich also SuspendThread() machen, damit der thread "pausiert" und wenn ich fertig bin ResumeThread() aufrufen um den weiter laufen zu lassen?

    und dann kill ich praktisch nur beim beenden meiner anwendung den thread

    aber da sollte ich doch warten bis das passiert ist, oder? weil sonst könnte ich probleme wegen dem delete bekommen, wenn das dingen noch net fertig is oder?



  • MSS-Software schrieb:

    aber da sollte ich doch warten bis das passiert ist, oder? weil sonst könnte ich probleme wegen dem delete bekommen, wenn das dingen noch net fertig is oder?

    Kommt darauf an, was der Thread noch machen will - ihm den Speicher unter dem Hintern wegzuziehen ist keine besonders gute Idee, in dem Fall eindeutig "JA" 😃



  • *gggg*

    neeee, nicht wirklich 🙂

    dann kommen da immer so kooooooomische fenster bit roten icons und so *ggg*

    neee, alles klar

    weiß ich bescheid

    danke dir 😉



  • ehm, wenn ich jetzt

    this->thread->SuspendThread();
    

    aufrufe, stürzt mir das Programm ab.

    Hab ich da was falsch gemacht?



  • Suspend sollte man nie aufrufen (siehe mein Blog)


Anmelden zum Antworten