带参数的线程调用库函数

Thread call library function with parameter

我正在尝试在线程中使用我的库的以下功能:

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);

但是我不知道如何调用它,因为在 CreateThread() 中输入参数是 LPVOID 而我不知道如何使用它。

我试过这个语法,但它不起作用:

CreateThread(0, 0, fPARKING2_apagar, {&hc,(LPTHREAD_START_ROUTINE)fPARKING2_getDatos(hc), &commit, &goForward, &goForwardCommit}, NULL, NULL, &threadId);

我也试过用std::thread,不过好像没有C++11所以没法用

您试图传递给 CreateThread()fPARKING2_apagar() 函数不满足 CreateThread() 期望的签名。你的线程函数的签名必须匹配 ThreadProc():

DWORD WINAPI ThreadProc(_In_ LPVOID lpParameter);

此外,您正试图将匿名结构传递给 CreateThread()lpParameter 参数。那也不行。

您需要编写一个可以传递给 CreateThread() 的包装函数,然后该包装函数可以调用库函数。使用 CreateThread()lpParameter 参数将用户定义的数据传递给线程函数,然后线程函数可以根据需要将其传递给库函数。

试试像这样的东西:

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;