_beginthreadex función miembro estático
-
12-09-2019 - |
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?
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 *);
};