带参数的线程调用库函数
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;
我正在尝试在线程中使用我的库的以下功能:
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;