c ++ - Tråd kald bibliotek funktion med parameter

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at bruge følgende funktion af mit bibliotek i en tråd:


typedef void (*TIPO\_FUNCION\_APARCAR\_COMMIT)       (HCoche hc);
typedef void (*TIPO\_FUNCION\_PERMISO\_AVANCE)       (HCoche hc);
typedef void (*TIPO\_FUNCION\_PERMISO\_AVANCE\_COMMIT)(HCoche hc);
int PARKING2\_aparcar(HCoche,void *datos,TIPO\_FUNCION\_APARCAR\_COMMIT,
                                             TIPO\_FUNCION\_PERMISO\_AVANCE,
                                             TIPO\_FUNCION\_PERMISO\_AVANCE\_COMMIT);


Men jeg kan ikke regne ud, hvordan jeg kan kalde det, for i CreateThread() er inputparameteren LPVOID, og jeg kan ikke se, hvordan jeg kan bruge den.


Jeg prøvede denne syntaks, men det virker ikke:


CreateThread(0, 0, fPARKING2\_apagar, {&hc,(LPTHREAD\_START\_ROUTINE)fPARKING2\_getDatos(hc), &commit, &goForward, &goForwardCommit}, NULL, NULL, &threadId);


Jeg forsøgte også at bruge std::thread, men det ser ud til, at jeg ikke har C + + 11, så jeg ikke kan bruge den.

Bedste reference


Funktionen fPARKING2\_apagar(), du forsøger at overføre til CreateThread(), tilfredsstiller ikke signaturen, som CreateThread() forventer. Signaturen til din trådfunktion SKAL svare til ThreadProc(): [17]


DWORD WINAPI ThreadProc(\_In\_ LPVOID lpParameter);


Desuden forsøger du at overføre en anonym struktur til lpParameter parametret for CreateThread(). Det vil heller ikke fungere.


Du skal skrive en wrapper-funktion, som du kan videregive til CreateThread(), og så kan wrapper kalde bibliotekets funktion. Brug lpParameter -parametrene for CreateThread() til at sende brugerdefinerede data til trådfunktionen, som derefter kan sende den videre til bibliotekets funktion efter behov.


Prøv noget mere som dette:


struct PARKING2\_aparcar\_params
{
    HCoche hc;
    void *datos;
    TIPO\_FUNCION\_APARCAR\_COMMIT aparcarCommit;
    TIPO\_FUNCION\_PERMISO\_AVANCE permisoAvance;
    TIPO\_FUNCION\_PERMISO\_AVANCE\_COMMIT permisoAvanceCommit;
};

DWORD WINAPI PARKING2\_aparcar\_wrapper(LPVOID lpParameter)
{
    PARKING2\_aparcar\_params *params = static\_cast<PARKING2\_aparcar\_params*>(lpParameter);
    fPARKING2\_aparcar(params->hc, params->datos, params->aparcarCommit, params->permisoAvance, params->permisoAvanceCommit);
    delete params;
    return 0;
}

...

PARKING2\_aparcar\_params *params = new PARKING2\_aparcar\_params;
params->hc = hc;
params->datos = fPARKING2\_getDatos(hc);
params->aparcarCommit = &commit;
params->permisoAvance = &goForward;
params->permisoAvanceCommit = &goForwardCommit;

hThread = CreateThread(NULL, 0, &PARKING2\_aparcar\_wrapper, params, 0, &threadId);
if (!hThread)
    delete params;