Pregunta

¿Cómo se crea una rutina de hilo de una función miembro estática

class Blah
{
    static void WINAPI Start();
};

// .. 
// ...
// ....

hThread = (HANDLE)_beginthreadex(NULL, 0, CBlah::Start, NULL, NULL, NULL);

Esto me da el siguiente error:

***error C2664: '_beginthreadex' : cannot convert parameter 3 from 'void (void)' to 'unsigned int (__stdcall *)(void *)'***

¿Qué estoy haciendo mal?

¿Fue útil?

Solución

A veces, es útil leer el error que está recibiendo.

cannot convert parameter 3 from 'void (void)' to 'unsigned int (__stdcall *)(void *)'

Veamos lo que dice. Para el parámetro de tres, se le da una función con el void(void) firma, es decir, una función que no tiene argumentos y no devuelve nada. No es capaz de convertir esto en unsigned int (__stdcall *)(void *), que es lo que _beginthreadex espera

Se espera una función que:

  • Devuelve un unsigned int:
  • Utiliza la convención de llamada stdcall
  • toma un argumento void*.

Así que mi sugerencia sería "darle una función con la firma que está pidiendo".

class Blah
{
    static unsigned int __stdcall Start(void*);
};

Otros consejos

class Blah
{
    static unsigned int __stdcall Start(void*); // void* should be here, because _beginthreadex requires it.
};

La rutina pasa al _beginthreadex deben utilizar la convención de llamada __stdcall y debe devolver un código de salida de rosca .

La aplicación de Bla :: Inicio:

unsigned int __stdcall Blah::Start(void*)
{
  // ... some code

  return 0; // some exit code. 0 will be OK.
}

Más adelante en su código se puede escribir cualquiera de los siguientes:

hThread = (HANDLE)_beginthreadex(NULL, 0, CBlah::Start, NULL, NULL, NULL);
// or
hThread = (HANDLE)_beginthreadex(NULL, 0, &CBlah::Start, NULL, NULL, NULL);

En primer caso Function-to-pointer conversion se aplica de acuerdo a C ++ estándar 4,3 / 1. En segundo caso, pasará puntero a funcionar de manera implícita.

class Blah
{
  public:
    static DWORD WINAPI Start(void * args);
};

A continuación se presenta la versión de compilación:

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;
}

Los siguientes son los cambios que se requieren:

(1). Start () función debe devolver unsigned int

(2). Se debe tomar un void * como parámetro.

Editar

punto Borrada (3) como por comentario

class Blah
{
    static unsigned int __stdcall Start(void *);
};
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top