_beginthreadex fonction membre statique
-
12-09-2019 - |
Question
Comment puis-je créer une routine de fil d'une fonction membre statique
class Blah
{
static void WINAPI Start();
};
// ..
// ...
// ....
hThread = (HANDLE)_beginthreadex(NULL, 0, CBlah::Start, NULL, NULL, NULL);
Cela me donne l'erreur suivante:
***error C2664: '_beginthreadex' : cannot convert parameter 3 from 'void (void)' to 'unsigned int (__stdcall *)(void *)'***
Qu'est-ce que je fais mal?
La solution
Parfois, il est utile de lire l'erreur que vous obtenez.
cannot convert parameter 3 from 'void (void)' to 'unsigned int (__stdcall *)(void *)'
Voyons ce qu'il dit. Pour trois paramètres, vous lui donnez une fonction avec la void(void)
signature, c'est une fonction qui ne prend aucun argument et ne retourne rien. Il ne parvient pas à convertir en unsigned int (__stdcall *)(void *)
, qui est ce que _beginthreadex
attend :
Il attend une fonction:
- Retourne un
unsigned int
: - Utilise la convention d'appel
stdcall
- Prend un argument
void*
.
Donc, ma suggestion serait « donner une fonction avec la signature, il est demander ».
class Blah
{
static unsigned int __stdcall Start(void*);
};
Autres conseils
class Blah
{
static unsigned int __stdcall Start(void*); // void* should be here, because _beginthreadex requires it.
};
La routine est passé à _beginthreadex
doit utiliser la convention d'appel __stdcall
et doit retourner un code de sortie de fil .
La mise en œuvre de Blah :: Début:
unsigned int __stdcall Blah::Start(void*)
{
// ... some code
return 0; // some exit code. 0 will be OK.
}
Plus tard dans votre code, vous pouvez écrire une des opérations suivantes:
hThread = (HANDLE)_beginthreadex(NULL, 0, CBlah::Start, NULL, NULL, NULL);
// or
hThread = (HANDLE)_beginthreadex(NULL, 0, &CBlah::Start, NULL, NULL, NULL);
En premier Function-to-pointer conversion
de cas sera appliqué selon la norme C ++ 4,3 / 1. En second cas, vous passerez pointeur de fonction implicite.
class Blah
{
public:
static DWORD WINAPI Start(void * args);
};
Ce qui suit est la version la compilation:
class CBlah
{
public:
static unsigned int WINAPI Start(void*)
{
return 0;
}
};
int main()
{
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &CBlah::Start, NULL, NULL, NULL);
return 0;
}
Après sont les changements nécessaires:
(1). fonction de démarrage () doit retourner unsigned int
(2). Il devrait prendre un vide * comme paramètre.
EDIT
point coupée (3) comme par commentaire
class Blah
{
static unsigned int __stdcall Start(void *);
};