如何在CreateThread中调用带多参数的库函数(无C++11环境)
解决CreateThread传递多参数调用PARKING2_aparcar的问题
因为CreateThread只能通过LPVOID传递单个参数,而你需要给PARKING2_aparcar传多个参数,最常用的方法是自定义一个结构体来打包所有需要的参数,然后把结构体指针作为CreateThread的参数传递,在线程入口函数里解包后调用目标函数。下面是具体实现步骤:
1. 定义参数结构体
首先创建一个结构体,包含PARKING2_aparcar需要的所有参数:
// 打包所有PARKING2_aparcar需要的参数 struct ParkingAparcarParams { HCoche hc; void* datos; TIPO_FUNCION_APARCAR_COMMIT commitFunc; TIPO_FUNCION_PERMISO_AVANCE goForwardFunc; TIPO_FUNCION_PERMISO_AVANCE_COMMIT goForwardCommitFunc; };
2. 编写线程入口函数
这个函数是CreateThread要求的LPTHREAD_START_ROUTINE类型,负责接收参数、解包并调用PARKING2_aparcar:
DWORD WINAPI ParkingAparcarThread(LPVOID lpParam) { // 把传入的指针转换为我们定义的结构体指针 ParkingAparcarParams* params = static_cast<ParkingAparcarParams*>(lpParam); // 调用目标函数,传入结构体里的所有参数 int result = PARKING2_aparcar( params->hc, params->datos, params->commitFunc, params->goForwardFunc, params->goForwardCommitFunc ); // 注意:如果结构体是堆分配的,这里要释放内存避免泄漏 delete params; // 线程返回值,这里可以根据需要返回result或0 return static_cast<DWORD>(result); }
3. 创建线程并传递参数
现在你可以创建结构体实例,填充参数,然后传给CreateThread:
// 分配结构体内存(用new或者malloc都可以,注意要和释放方式匹配) ParkingAparcarParams* params = new ParkingAparcarParams(); params->hc = hc; params->datos = fPARKING2_getDatos(hc); // 假设这是获取datos的正确方式 params->commitFunc = commit; params->goForwardFunc = goForward; params->goForwardCommitFunc = goForwardCommit; // 创建线程 DWORD threadId; HANDLE hThread = CreateThread( NULL, // 默认安全属性 0, // 默认栈大小 ParkingAparcarThread, // 线程入口函数 params, // 传递的参数(结构体指针) 0, // 立即启动线程 &threadId // 输出线程ID ); // 记得检查线程是否创建成功 if (hThread == NULL) { // 创建失败,处理错误,同时要释放已分配的结构体 delete params; // 比如调用GetLastError()获取错误码 }
为什么你原来的写法不行?
CreateThread的lpParameter只能接受单个指针,你直接传{&hc, ...}这种初始化列表是不合法的,编译器无法将其转换为LPVOID。(LPTHREAD_START_ROUTINE)fPARKING2_getDatos(hc)这里存在错误:fPARKING2_getDatos(hc)是函数调用的结果(返回的void*),不是函数指针,强制转换为LPTHREAD_START_ROUTINE是无意义的,你应该直接把这个返回值赋值给结构体的datos成员。
注意事项
- 如果结构体是在栈上创建的,要确保线程运行期间栈内存不会被销毁(比如不能在函数栈上创建然后函数返回,线程还在运行),所以更推荐用堆分配(
new/malloc)。 - 线程结束后一定要释放结构体内存,避免内存泄漏。如果线程可能提前退出,要确保在所有退出路径都进行释放。
- 如果你用C而不是C++,把
new/delete换成malloc/free,类型转换用(ParkingAparcarParams*)而不是static_cast。
内容的提问来源于stack exchange,提问作者Antoine D
相关产品推荐
相关产品推荐

