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?

È stato utile?

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 *);
};
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top