ThreadProc dynamisch
-
jemand ne ahnung wie ich ner structur ne dynamische lpAddress, also Thread Funktion zuweise;
zb.: typedef struct tagTHREAD{ DWORD WINAPI MyThreadProc; bool CreatemyThread; } THREADPROC; mit CreateThread(NULL,NULL,THREADPROC::MyThreadProc, etc... funktioniert irgendwie nicht, jemand ne idee?will dann zb:
DWORD WINAPI THRAEDPROC::MyThreadProc(LPVOID LPARAM){ } THREADPROC::CreateMyThread(){ CreateThread(NULL,NULL,THREADPROC::MyThreadProc, etc... }und dass dann wie folgt definieren:
THRADPROC myThread; myThread::CreateThread(.........nur hats irgendwie ein problem nit der definition
DWORD WINAPI THRAEDPROC::MyThreadProc(LPVOID LPARAM){
-
Dein Pseudo Code ist ein riesen-durcheinander!
Funktionsdekl. haben runde Klammern!Ausserdem lässt man typedef struct blabla... in C++ weg. Das ist C- Style und überhaupt nicht nötig!
Was willst Du genau erreichen?
Dein Thread in eine Klasse packen?Simon
-
Wenn ich dich richtig verstehe, dann willst du da einen Memberfunktionszeiger übergeben. Das geht so nicht, weil ein solcher Zeiger noch ein Argument, also ein Objekt erwartet. Wenn du das Objekt angeben kannst, kannst du das z.B mit boost::bind elegant lösen.
-
ne andere möglichkeit als boost gibts nicht?
-
Doch, doch. Die gibts zu Hauf.

Kannst ja auch z.B die Standardbilbliothek benutzen, welche dir bind1st anbietet.
Mit boost::bind ist das ganze halt einfach schöner. (Nicht ohne Grund wird es im näschten Standard ein äquivalent zu boost::bind geben, welches dann bind1st und bind2nd ablösen wird).
-
kapier das bind1st irgendwie nicht...
es müsste also den MemberZeiger das argument lParam auf die Function ThraedProc binden?bind1st(&THREADPROC::ThreadProc(),lParam));oder wie ist das zu verstehen
-
das problem ist irgendwie ich brauch eben für jeden Thread Der dynamisch erzeugt wird ne eigene Dynamische funktion.
da jeder Timer , ja ich versuch nen angemessenen timer zu programmieren, in einem eigenen thread läuft damit der TIMER unabhängig vom restlichen programm läuft.tjo tja das ists
-
Hallo,
CreateThread erwartet in lpStartAddress, eine quasi statische Funktion,
nicht eine Klassen Funktion.Den Prototype der Funktion gibt das SDK wie folgt an:
DWORD WINAPI ThreadProc(LPVOID lpParameter);Wenn du tatsächlich eine Klassenfunktion starten willst,
kannst du dir in lpParameter den this pointer übergeben:Also irgendwie so etwas:
hndl = CreateThread(lpThreadAttributes, dwStackSize, my_thread_function, this, dwCreationFlags, lpThreadId);mit
DWORD WINAPI my_thread_function(LPVOID lpParameter // thread data) { my_class* pMy_class = static_cast<my_class*>(lpParameter) pMy_class-> ... return 0; }Das ist alles nicht schön, funktioniert aber.
Ich hoffe das war einigermaßen verständlich.Aber noch ein Hinweis:
Es kann in Zusammenhang mit Threads und Klassen richtig Ärger geben,
wenn die Klasse weg ist aber der Thread noch da ist.
Das wird nicht einfacher durch Vererbung.Gruß Frank
-
jo danke
-
Frank Erdorf schrieb:
Das ist alles nicht schön, funktioniert aber.
Ich hoffe das war einigermaßen verständlich.Aber noch ein Hinweis:
Es kann in Zusammenhang mit Threads und Klassen richtig Ärger geben,
wenn die Klasse weg ist aber der Thread noch da ist.
Das wird nicht einfacher durch Vererbung.Gruß Frank
ich hab die Handles der Threads eh im Timer gespeichert die können dann sicher geschlossen werden.