La façon la plus simple de gérer cela est de créer une fonction "stub" qui rappelle dans votre classe.
UINT tid
HANDLE hThread = CreateThread(NULL, 0, myThreadStub, this, 0, &tid);
....
unsigned long WINAPI myThreadStub(void *ptr)
{
if (!ptr) return -1;
return ((MyClass*)ptr)->ThreadMain();
}
CreateThread() vous permet de passer un argument à la fonction de fil (paramètre 4 de l'appel CreateThread()). Vous pouvez l'utiliser pour passer un pointeur sur votre classe. Vous pouvez ensuite renvoyer le pointeur vers le type approprié, puis appeler une fonction membre. Vous pouvez même avoir "myThreadStub" être un statique membre de "MyClass", lui permettant d'accéder à des membres privés et des données.
Si vous avez installé boost, vous pouvez utiliser boost :: bind pour cela sans créer de fonction de remplacement. Je ne l'ai jamais essayé sur les fenêtres, je ne peux pas dire pour sûr que cela fonctionne (parce que la fonction de rappel doit être un appel WINAPI) mais si cela ne fonctionne, il ressemblerait à quelque chose comme:
HANDLE hThread = CreateThread(NULL, 0, boost::bind(&MyClass::ThreadFunction, this), NULL, 0, &tid);
Où La fonction thread est une fonction membre non statique qui prend un seul argument void *.
Quelle langue? – kennytm
J'utilise vC++ – prabhakaran
Le problème est qu'une "fonction membre" est en fait deux choses: un pointeur vers la fonction, et un pointeur vers l'instance à laquelle l'appliquer. C++ ne peut pas transformer cela en un simple pointeur de fonction (enfin, ça peut, mais ça ne marche pas assez fort). –