_beginthreadex funzione membro statica
-
12-09-2019 - |
Domanda
Come posso creare una routine thread di una funzione membro statica
class Blah
{
static void WINAPI Start();
};
// ..
// ...
// ....
hThread = (HANDLE)_beginthreadex(NULL, 0, CBlah::Start, NULL, NULL, NULL);
Questo mi dà il seguente errore:
***error C2664: '_beginthreadex' : cannot convert parameter 3 from 'void (void)' to 'unsigned int (__stdcall *)(void *)'***
Che cosa sto facendo di sbagliato?
Soluzione
A volte è utile leggere l'errore che ricevi.
cannot convert parameter 3 from 'void (void)' to 'unsigned int (__stdcall *)(void *)'
Diamo un'occhiata a cosa dice.Per il parametro tre, dagli una funzione con la firma void(void)
, ovvero una funzione che non accetta argomenti e non restituisce nulla.Non riesce a convertirlo in unsigned int (__stdcall *)(void *)
, che è cosa _beginthreadex
si aspetta:
Si aspetta una funzione che:
- Restituisce un
unsigned int
: - Utilizza il
stdcall
convenzione di convocazione - Ci vuole un
void*
discussione.
Quindi il mio suggerimento sarebbe "dagli una funzione con la firma che richiede".
class Blah
{
static unsigned int __stdcall Start(void*);
};
Altri suggerimenti
class Blah
{
static unsigned int __stdcall Start(void*); // void* should be here, because _beginthreadex requires it.
};
La routine passato al _beginthreadex
deve utilizzare la convenzione di chiamata __stdcall
e deve restituire un codice di uscita filo .
L'attuazione del Blah :: inizio:
unsigned int __stdcall Blah::Start(void*)
{
// ... some code
return 0; // some exit code. 0 will be OK.
}
più avanti nel codice si potrebbe scrivere uno dei seguenti:
hThread = (HANDLE)_beginthreadex(NULL, 0, CBlah::Start, NULL, NULL, NULL);
// or
hThread = (HANDLE)_beginthreadex(NULL, 0, &CBlah::Start, NULL, NULL, NULL);
Nel primo caso Function-to-pointer conversion
saranno applicati secondo C ++ standard 4.3 / 1. Nel secondo caso si passa puntatore a funzione in modo implicito.
class Blah
{
public:
static DWORD WINAPI Start(void * args);
};
In seguito è la versione compilazione:
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;
}
Di seguito sono le modifiche necessarie:
(1). Inizio () funzione dovrebbe restituire unsigned int
(2). Si dovrebbero prendere un void * come parametro.
Modifica
punto eliminato (3) come da commento
class Blah
{
static unsigned int __stdcall Start(void *);
};