wxThread kann nicht angehalten werden



  • Hi

    ich erzeuge Threads die etwas bestimmtes abarbeiten sollen.

    ich kann mehrere erzeugen doch ich kann sie nicht anhalten, bzw schon nur da stürzt jedesmal das ganze Programm ab.

    zum starten eines Thread

    int TBeispielThread::Start(){
            _hThread = new TModulThread();
            if ( _hThread->Create() != wxTHREAD_NO_ERROR){
                WriteMemoStr("Thread konnte nicht Created werden");
                delete _hThread;
                _hThread = NULL;
            }
    
            if ( _hThread->Run() != wxTHREAD_NO_ERROR){
                WriteMemoStr("Thread konnte nicht gestartet werden");
                delete _hThread;
                _hThread = NULL;
            }
    }
    

    zum stoppen

    int TBeispielThread::Stop(){
            if ( _hThread){
                if ( _hThread->Delete() != wxTHREAD_NO_ERROR){
                    WriteMemoStr(" Thread konnte nicht gelöscht werden");}
            }
            WriteMemoStr("thread beendet");
    }
    

    dort wo es arbeitet

    wxThread::ExitCode TModulThread::Entry(){
        int i;
        long thr_id;
        for ( i=0; i <= 20; i++){
                if( TestDestroy()) break;
                crit_sect.Enter();
                thr_id = TModulThread::GetId();
                WriteMemoStr( wxString::Format(wxT("%i"),i) + "---" + wxString::Format(wxT("%i"),thr_id));
                crit_sect.Leave();
                wxThread::Sleep(100);
            }
    
            return ( wxThread::ExitCode)0;
    }
    

    wenn ich 3 Threads haben möchte dann ruf ich 3 mal die Start() funktion auf und zum spoppen 3 mal die Stop().

    also das erzeugen klappt wiegesagt nur beim stoppen hängt sich das programm auf

    ich hoffe ihr könnt mir helfen 🙂
    Danke schon mal im vorraus


  • Mod

    Seh ich jetzt erstmal keinen Fehler.
    Denke du erzeugst dann ja auch 3 Threadinstanzen, wo du für jede Instanz Delete aufrufst.

    Ansonsten kann ich nur auf die Doku verweisen:
    http://docs.wxwidgets.org/stable/wx_wxthread.html#deletionwxthread



  • ja mach ich
    ich kann ja nochmal die klasse mit reinstellen

    class TModulThread : public wxThread
    {
        public:
            TModulThread( )
                        : wxThread(wxTHREAD_JOINABLE)
                        { }
            virtual ExitCode Entry();
    
        private:
            TModulThread(const TModulThread &copy);
    };
    

    vielleicht hilft das ja noch



  • wie ist es möglich nur einen bestimmten thread zu beenden?
    die id kann man sich ja anzeigen lassen, kann man auch über die id den thread beenden?


  • Mod

    Du solltest zu jedem Thread auch eine entsprechende Klasseninstanz haben.
    dann einfach thread->Delete();



  • ich erzeuge für jeden Thread ein neues objekt

    _hThread = new TModulThread();
    

    und die Anzahl der Threads ist dynamisch


  • Mod

    Hast du dann auch jeweils eine eigene TBeispielThread Instanz dafür?

    Du brauchst ja eben zugriff auf diese Threadinstanz um sie zu beenden.



  • ne glaube ni
    und ich weiß auch nicht sorecht wie, bin gerade etwas verwirrt 😮 😕


  • Mod

    Beispielcode:

    MyThread* t;
    for(int i = 0; i < 10; i++)
    {
      t = new MyThread();
      t->run();
    }
    t->Delete();
    

    Hier verlierst du die ersten 9 Instanzen, bisher hast du aber den genauen Code wie du das machst noch nicht gezeigt, daher weiss ich nicht, wie du da was machst.


Anmelden zum Antworten