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?

Était-ce utile?

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 *);
};
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top