Threads und Klasse??
-
Also ich habe eine Klasse und darin diese Funktion:
void CServer::TreatSocketNotify(UINT uMsg, WPARAM wParam, LPARAM lParam);
In dieser Funktion möchte ich jetzt einen Tread starten, der eine andere Funktion meiner Klasse aufruft:
// function to treat socket notify void CServer::TreatSocketNotify(UINT uMsg, WPARAM wParam, LPARAM lParam) { // private int sockRequest; DWORD dwThreadID; // get socket sockRequest = wParam; // switch event switch (WSAGETSELECTEVENT(lParam)){ // a client want to be accepted case FD_ACCEPT: CreateThread(0, 0, AcceptClient, (void*)NULL, 0, &dwThreadID); break; // data is waiting case FD_READ: CreateThread(0, 0, TreatClientCommand, (void*)sockRequest, 0, &dwThreadID); break; // client closed connection case FD_CLOSE: break; } }
Die 2 Funktionen sind so deklariert:
DWORD WINAPI TreatClientCommand(void* _sockClient); DWORD WINAPI AcceptClient(void* _sockClient);
Fehler:
Compiling... CServer.cpp d:\projekte\cchat\cserver.cpp(54) : error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)' None of the functions with this name in scope match the target type d:\projekte\cchat\cserver.cpp(59) : error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)' None of the functions with this name in scope match the target type Error executing cl.exe. Creating browse info file... CChat.lib - 2 error(s), 0 warning(s)
Was ist falsch?
Danke!
cu para
-
Mir ist gerade klar geworden, dass es garnicht nötig ist die Funktionen:
DWORD WINAPI TreatClientCommand(void* _sockClient); DWORD WINAPI AcceptClient(void* _sockClient);
in die Klasse einzubinden.
Aber würde es nicht trotzdem gehen?
-
Gibt es die Funktion AcceptClient mehrmals, einmal in der klasse, einmal global?
Wenn die Thread-Funktionen als static deklariert sind, sollte es kein Problem darstellen, dass sie sich in einer Klasse befinden.
-
danke, es geht!
-
Habe da jetzt noch eine Frage:
Eine Funktion in meiner Klasse akzeptiert Clients (Winsock).
Jedes Mal wenn das funktioniert hat, sollte eine Funktion in dem Hauptprojekt aufgerufen werden. Wie mache ich das?
-
Wo ist dabei dein Problem?
-
Du hast mich vermutlich falsch verstanden:
Die klasse ist in einer Bibliothek. Wenn ich jetzt einen Client akzeptiere mit Erfolg soll im Hauptprojekt eine Funktion aufgerufen werden. Diese Funktion ist aber praktisch nicht bekannt, da sie ja je nach Projekt, in dem ich meine Lib benutze untershiedlich ist.Ich meine soetwas wie bei CreateThread oder SetTimer.
danke!
cu para
-
Dann übergibst du halt einen Funktionszeiger
-
Ja das ist ja gerade die Frage! Wie mache ich sowas? Und das größere Problem ist dann wie ich diese Funktion aufrufe??
-
Das steht in jedem guten C/C++ Buch / Tutorial
-
Also habs jetzt so:
void (*funcNotify)(int iCode);
Und:
function(void _funcNotify) { ... funcNotify = _funcNotify; ... }
Geht aber net. Was mach ich falsch?
-
man, völlig falsch. guck doch einfach in ein buch oder tutorial? ist das so schwer??!
-
Hab ich ja, aber ich weiss nicht wie es geht, wenn die Funktion über eine Funktion übergeben wird, hab edazu auch nichts gefunden. Anders klappt es ja, aber ich brauche es so.
Wieso kannst du es mir nicht einfach sagen
Naja...
-
Also ich glaube das geht so:
Als erstes machst du ein typedef, dann is alles leichter, also so:typedef void(*pFunc)(int); //Zeiger auf Funktion vom Typ void, die einen int //als Argument braucht
Mit pFunc kannst du jetzt Zeiger auf Funktionen von diesem Typ erstellen.
Wenn du eine Funktion als Argument übergeben wilst, sieht das in etwa so aus:
void Funktion(pFunc func) //Deklaration einer Funktion, die einen Zeiger auf { //oben genannten Funktionstyp als Argument erwartet //hier is irgendein Code *func(x); //Hier wird deine Funktion aufgerufen, mit * //x muss natürlich vorher irgendwo als int deklariert werden //wieder irgendein Code };
In der Zeile "void Funktion(pFunc func)" wir nicht das int-Argument der Funktion mit
übergeben. Wenn du das so möchtest, musst du noch einen 2. Parameter übergeben,
also in etwa sovoid Funktion (pFunc func,int x) { *func(x); };
Das müsste so alles passen, zumindest hab ich auf die Schnelle keinen Fehler gefunden.
mfg Michael