Bonjour a tous. J'ai un problème avec un thread.
Comme je n'y comprenait rien, j'ai decidé de faire le code minimal pour que le problème apparaisse.
Voici d'abord un code qui marche: Je crée un thread, attends 5 secondes, et le termine. le thread se contente d'écrire "mainLoop" en boucle:
ça c'est bien. Mais moi ce que je souhaite faire, c'est une classe dont le HANDLE du thread est une variable d'instance, et la fonction du thread (mainLoop) est une fonction de la classe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #include <iostream> #include <windows.h> using namespace std; // thread function: DWORD WINAPI mainLoop(LPVOID lpParameter) { while(1) { Sleep(500); cout<<"mainLoop"<<endl; } } int main(void) { HANDLE hThread = CreateThread(NULL,0,mainLoop,NULL,0,NULL); Sleep(5000); TerminateThread(hThread,0); }
Lors de la création d'un objet de la classe, on crée le thread
Lors de la destruction, on le termine. J'ai donc un tout petit peu modifier le code ci-dessus, et la compilation échoue:
L'erreur de compil est à la ligne ou il y a le CreateThread:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 #include <iostream> #include <windows.h> using namespace std; class myClass { private: HANDLE hThread; DWORD WINAPI mainLoop(LPVOID lpParameter); public: myClass(); ~myClass(); }; DWORD WINAPI myClass::mainLoop(LPVOID lpParameter) { while(1) { Sleep(500); cout<<"mainLoop"<<endl; } } myClass::myClass() { hThread = CreateThread(NULL,0,mainLoop,NULL,0,NULL); } myClass::~myClass() { TerminateThread(hThread,0); } int main(void) { myClass *myObject = new myClass(); Sleep(5000); delete myObject; }
J'ai donc suivi le conseil de Visual Studio, et j'ai changé le constructeur en:myClass::mainLoop: function call missing agrument list; use &myClass::mainLoop to create a pointer to member
mais la j'ai une autre erreur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 myClass::myClass() { hThread = CreateThread(NULL,0,&myClass::mainLoop,NULL,0,NULL); }
Le seul moyen que j'ai trouvé pour que ça compile, c'est de déclarer la fonction mainLoop statique. Mais ça ne me convient pas. Est-ce qu'il y a moyen de faire ce que je souhaite avec une fonction non statique?
Code : Sélectionner tout - Visualiser dans une fenêtre à part error C2664: 'CreateThread' : cannot convert parameter 3 from 'DWORD (__stdcall myClass::* ) (LPVOID)' to 'LPTHREAD_START_ROUTINE'
Est-ce que quelqu'un a une idée?
merci
Partager