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
-
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 reinstellenclass TModulThread : public wxThread { public: TModulThread( ) : wxThread(wxTHREAD_JOINABLE) { } virtual ExitCode Entry(); private: TModulThread(const TModulThread ©); };
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?
-
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
-
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
-
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.