c ++ - Sådan overføres funktion pointer som lpParameter til CreateThread?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har følgende funktion, som vil blive kaldt af CreateThread:


DWORD WINAPI start\_thread(LPVOID handleFunction)
{
    int prio = 4;

    // call handleFunction()
    handleFunction(prio);

    return TRUE;
}


Og jeg laver tråden her:


DECL\_PREFIX tid\_t so\_fork(so\_handler *handleFunction, unsigned priority) {

    DWORD dw;


    hThr[currentThread] = CreateThread(
        NULL,                                       // default security attributes
        0,                                          // use default stack size  
        (LPTHREAD\_START\_ROUTINE)start\_thread,       // thread function name
        (LPVOID)&handleFunction,                        // argument to thread function 
        0,                                          // use default creation flags 
        &dw);           // returns the thread identifier 

    return 0;
}


Jeg får følgende fejl, når jeg builind det:


Error   C2064   term does not evaluate to a function taking 1 arguments libscheduler    

expression preceding parentheses of apparent call must have (pointer-to-) function type libscheduler


Hvad laver jeg det forkert?

Bedste reference


Passerer &handleFunction til CreateThread() er forkert, fordi du passerer den lokale adresse på handleFunction variablen selv, ikke adressen til so\_handler, som den peger på.


Da handleFunction allerede er en pointer, prøv noget mere som dette i stedet:


DWORD WINAPI start\_thread(LPVOID handleFunction)
{
    int prio = 4;

    // call handleFunction()
    so\_handler *handler = (so\_handler *) handleFunction;
    handler(prio); // or maybe (*handler)(prio), depending on how so\_handler is actually defined...

    return TRUE;
}

DECL\_PREFIX tid\_t so\_fork(so\_handler *handleFunction, unsigned priority) {

    DWORD dw;

    hThr[currentThread] = CreateThread(
        NULL,                    // default security attributes
        0,                       // use default stack size  
        &start\_thread,           // thread function name
        handleFunction,          // argument to thread function 
        0,                       // use default creation flags 
        &dw);                    // returns the thread identifier 

    return 0;
}