Thread für Methode eines Objekts
-
Hallo zusammen!
Ich hab mal wieder ein Problem :(... Ich habe ein Objekt einer Klasse und von diesem Objekt möchte ich nun eine Methode in einem extra Thread laufen lassen... Hier mal mein kleines Testszenario, welches ich gebaut habe :).
class CTest { public: void Start(); }; void CTest::Start() { while () { Sleep(1000); TRACE("JA"); } }Nun möchte ich in meiner InitInstanze diese Methode Start von einem Objekt in einem Thread starten... aber wie
class CApp : public CWinApp { public: BOOL InitInstance(); private: CTest* m_pTest; }; BOOL CApp::InitInstance() { pTest = new CTest; // Hier jetzt irgendwie einen Thread für die Methode starten... // Aber wie geht das?! [b]pTest->Start();[/b] }Danke für Antworten...
-
Schau dich mal nach AfxBeginThread() um (der Funktion kannst du allerdings nur statische Methoden mitgeben, d.h. du benötigst einen Wrapper)
class CTest { public: static void ThStart(LPVOID who) { static_cast<CTest*>(who)->Start(); } void Start(){whatever} }; ... pTest=new CTest; AfxBeginThread(CTest::ThStart/*Thread-Funktion*/,pTest/*Parameter 'LPVOID who'*/); ...
-
Danke für die Antwort CStoll... also das ganze klappt jetzt... aber nur wenn
::AfxBeginThread((AFX_THREADPROC) CThreadWrapper::StartThread, (LPVOID) m_pTest);Das ganze so aufrufe... wenn ich das (AFX_THREADPROC) weglasse gibt es einen Kompilerfehler
"AfxBeginThread": Durch keine der 2 Überladungen konnten alle Argumenttypen konvertiert werden.
c:\programme\microsoft visual studio 8\vc\atlmfc\include\afxwin.h(4202): kann 'CWinThread *AfxBeginThread(AFX_THREADPROC,LPVOID,int,UINT,DWORD,LPSECURITY_ATTRIBUTES)' sein
c:\programme\microsoft visual studio 8\vc\atlmfc\include\afxwin.h(4205): oder "CWinThread *AfxBeginThread(CRuntimeClass *,int,UINT,DWORD,LPSECURITY_ATTRIBUTES)"
bei Anpassung der Argumentliste '(overloaded-function, LPVOID)'War das zu erwarten?! :)... bzw. wieso erkennt der Compiler das nicht automatisch ;)... Oder ist das jetzt so ne schlechte Lösung?!
-
Wie beende ich den nun den Thread? Muss ich das aus der Methode selber machen? Oder kann ich das von außerhalb machen...
Wenn ich einfach nur den zurückgegebenen Thread von AfxBeginThread (CWinThread*) delete bekomme ich immer eine Zugriffsverletzung...
Danke für Hilfe
-
Hallo zusammen,
also ich hab jetzt mal ein bischen mit dem Thread rumgespielt... nun ich kann den Thread entweder beenden indem ich die aufgerufene Funktion beende oder aber das ganze über AfxEndThread(0) beende...
Im zweiten Fall ist mir folgendes aufgefallen. Verwende ich irgendwelche Variablen in dieser Threadmethode (z.B. CString sTest), dann wird diese nicht entladen und ich bekomem DumpingObjects... wenn ich die Methode über ein return beende funktioniert es und die Objects werden entfernt.
Meine Frage ist nun... kann ich in dieser Methoed nur mit Zeigern arbeiten, damit ich sie selber freigeben kann über delete, falls ich AfxEndThread verwenden möchte oder gibt es eine Möglichkeit, dass die Objekte auch so vom Speicher entfernt werden?