Threads zum x-ten mal
-
Hallo,
eigentlich tut es mir fast leid, diese Frage zu stellen, da sie schon zigfach behandelt wurde. Aber eine direkte Lösung für mein Problem habe ich per Forensuche nicht gefunden.
Was ich machen möchte: Per CreateThread (...) einen Thread erzeugen. Alle zu übergebenden Parameter sind trivial, bis auf den dritten, welcher einen Zeiger auf die auszuführende Funktion symbolisiert.
Diese Funktion ist Teil meiner CProjektnameDlg-Klasse und verwendet diverse Membervariablen derselben. Wie muss ich diese Funktion an CreateThread (...) übergeben, um keine Fehlermeldung zu bekommen?Mein Code:
CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) Funktionsname, 0, 0, NULL);
BOOL CProjektnameDlg::Funktionsname(void) { ... }
Der Fehler:
error C2440: 'type cast' : cannot convert from 'overloaded-function' to 'LPTHREAD_START_ROUTINE'
None of the functions with this name in scope match the target typeWenn ich aus einer normalen *.h Datei eine Funktion void test (void) {...} aufrufe, macht das keine Probleme. Nur wenn ich eine Funktion aus meiner Klasse aufrufen möchte, gibt es obige Fehlermeldung.
Ich hoffe, dass das überhaupt so geht, verweist mich bitte nicht an _beginthread (...)
Alexander
-
Zu Threads kann man natürlich viel erzählen.
Daher von mir, hier nur zwei Kommentare:
1.) Dir ist schon bekannt das eine Member-Funktion auch ohne Parameterliste
IMMER zumindest einen Parameter hat, nämlich den this-Pointer ?
2.) Ich hoffe du weisst warum du _beginthreadex() verwenden solltest.mfg JJ
-
Naja, so wirklich hilft mir das leider nicht, habe meine Memberfunktion mal nach Anleitung des MSDN abgeändert zu:
unsigned __stdcall CMeineKlasseDlg::MeineFunktion(void* pArguments)
Der Threadstart sollte so erfolgen:
startadd = (HANDLE) _beginthreadex (NULL, 0, &MeineFunktion, NULL, 0, &threadid);
Doch welch Wunder, das & vor MeinFunktion bringt eine Fehlermeldung.
error C2276: '&' : illegal operation on bound member function expression
Entferne ich es, gibt es die nächste Fehlermeldung.
error C2664: '_beginthreadex' : cannot convert parameter 3 from 'unsigned int (void *)' to 'unsigned int (__stdcall *)(void *)'
Irgendwie ist mir das alles langsam zu hoch
-
ich würds mit AfxBeginThread () machen.
class MyClass { public: bool StartThread (); static UINT Thread ( LPVOID pParam); void Work (); } UINT MyClass::Thread ( LPVOID pParam) { MyClass* pObj = ( MyClass*) pParam; pObj->Work (); return S_OK; } bool MyClass::StartThread () { if ( !AfxBeginThread ( Thread, this)) return false; return true; } void MyClass::Work () { //diese funktion wird indirekt im neuen thread //ausgeführt }
neue threads können ja immer nur statische oder globale funtionen ausführen,
deshalb musst du einen zeiger auf das objekt, dessen
funtion gestartet werden soll übergeben, und diese dann ausführen
-
Vielen Dank für die funktionsfähige Lösung, hatte schon gedacht, dass ich das nicht mehr zum laufen bekomme.
Frage mich allerdings auch, warum so etwas weder in den MSDN noch in einem meiner diversen Visual C++ Bücher zu finden ist.
Also nochmal besten DankAlex
-
Hi,
John Doe schrieb:
2.) Ich hoffe du weisst warum du _beginthreadex() verwenden solltest.
weiß ich leider nicht, würde mich aber mal interessieren
LG
Bum
-
das hab ich mal in nem buch zur mfc-programmierung
gefundenda is das einigermassen verständlich erklärt
bis dann man, ich
-
Bum schrieb:
Hi,
John Doe schrieb:
2.) Ich hoffe du weisst warum du _beginthreadex() verwenden solltest.
weiß ich leider nicht, würde mich aber mal interessieren
LG
Bum_beginthreadex ist ein C-Runtime Library Call (ruft intern CreateThread auf)
CreateThread ist ein WinAPI-Calldarum besser ersteres verwenden
Falls du zusätzlich noch MFC support brauchst im neuen Thread müsstest du AfxBeginThread aufrufen (ruft intern _beginthreadex auf).