[wxWidgets] wxThread: Programm stürzt ab



  • Hallo Community,

    ich versuche schon seit einigen Tagen einen wxThread zu erstellen, ihn zu starten und zu beenden.

    Deshalb habe ich mal ein minimales Programm geschrieben, aber genau dasselbe Phänomen:
    Bei Beenden des Threads (detached) mittels Delete() stürzt mein Programm einfach ab.
    Auch ein try-catch-Block bringt nichts.

    Meine abgeleitete Klasse TMyThread enthält lediglich eine Entry()-Funktion mit einem return (wxThread::ExitCode)0;

    Mein Code:
    (Meine Form hat zwei Buttons [Start thread!] und [Stop thread!] und ein wxTextCtrl, welche als Log dient)

    void TMainFrame::OnStartThread(wxCommandEvent& event)
    {
      try
      {
        if (!m_myThread)
        {
          wxLogMessage( _("Creating the thread...") );
          m_myThread = new TMyThread;
    
          wxLogMessage( _("  -Create new instance") );
    
          if (m_myThread)
            wxLogMessage( _("    OK") );
    
          wxLogMessage( _("  -Call Create()") );
          if ( m_myThread->Create() != wxTHREAD_NO_ERROR )
          {
            wxLogError( _("    NOT OK! ABORTING...!") );
            delete m_myThread;
            m_myThread = NULL;
            return;
          }
          else
          {
            wxLogMessage( _("    OK") );
          }
          wxLogMessage( _("  -Call Run()") );
    
          if ( m_myThread->Run() != wxTHREAD_NO_ERROR )
          {
            wxLogError( _("    NOT OK! ABORTING...!") );
            delete m_myThread;
            m_myThread = NULL;
            return;
          }
          else
          {
            wxLogMessage( _("    OK") );
          }
        }
      }
      catch(...)
      {
        wxLogError( _("Exception in OnStartThread()!") );
      }
    }
    
    void TMainFrame::OnStopThread(wxCommandEvent& event)
    {
      try
      {
        if (m_myThread)
        {
          wxLogMessage( _("Deleting the thread...") );
          wxLogMessage( _("  -Call Delete()") );
          if ( m_myThread->Delete() != wxTHREAD_NO_ERROR )
          {
            wxLogError( _("    NOT OK!") );
          }
          else
          {
            wxLogMessage( _("    OK") );
          }
    
          delete m_myThread;
          m_myThread = NULL;
        }
      }
      catch(...)
      {
        wxLogError( _("Exception in OnStopThread()!") );
      }
    }
    

    Ich habe mich schon am Beispiel in der Doku orientiert.

    Naja ich hoffe mir kann hier jemand helfen 😉
    Vielen Dank im Voraus.

    MfG
    wxError



  • Hi,

    da dein Thread ja nur (wxThread::ExitCode)0 zurück gibt ist er ja flink wieder wech... Vielleicht klärt das ja dein Problem:
    http://www.ijon.de/comp/tutorials/threads/create.html
    ..so bei Joinable und detached Threads

    Weil auf http://docs.wxwidgets.org/2.9.2/classwx_thread.html machen die ja ein bischen mehr.
    Wenn du während der Thread läuft, dann den Stuhl untern Hintern...

    wxThread::ExitCode MyThread::Entry()
        {
            while (!TestDestroy())
            {
                // ... do a bit of work...
    
                wxQueueEvent(m_pHandler, new wxThreadEvent(wxEVT_COMMAND_MYTHREAD_UPDATE));
            }
    
            // signal the event handler that this thread is going to be destroyed
            // NOTE: here we assume that using the m_pHandler pointer is safe,
            //       (in this case this is assured by the MyFrame destructor)
            wxQueueEvent(m_pHandler, new wxThreadEvent(wxEVT_COMMAND_MYTHREAD_COMPLETED));
    
            return (wxThread::ExitCode)0;     // success
        }
    

    Gruß



  • if (m_myThread)
        {
          wxLogMessage( _("Deleting the thread...") );
          wxLogMessage( _("  -Call Delete()") );
          if ( m_myThread->Delete() != wxTHREAD_NO_ERROR )
          {
            wxLogError( _("    NOT OK!") );
          }
          else
          {
            wxLogMessage( _("    OK") );
          }
    
          delete m_myThread;
          m_myThread = NULL;
        }
    

    Delete() solltest du nur anwenden, wenn du ganz sicher bist, dass der Thread noch laeuft. Am besten du postest dafuer ein Event, wie im Beispielcode von FrankTheFox. Detached Threads "delete"n sich selbst, wenn der Thread beendet ist. Das "delete m_myThread;" ist somit voelliger Mist.
    Delete() bringt ausserdem nur was, wenn du TestDestroy()-Aufrufe in deiner Entry-Funktion einbaust. Wenn das aus irgendeinem Grund nicht moeglich ist, gibts auch noch Kill()...


Anmelden zum Antworten