【发布时间】:2023-03-21 17:45:01
【问题描述】:
当我尝试使用CreateThread 函数时,我遇到了一个奇怪的错误。这是我的代码:
HANDLE threads[3]; //threads[0] is printer, threads[1] is receiver, [2] is serverconn
DWORD printer_id, receiver_id, serverconn_id;
if(
((threads [0] = CreateThread(NULL, 0, printer_thread, (LPVOID) thread_args, 0, &printer_id)) == NULL) ||
((recv_thread = threads [1] = CreateThread(NULL, 0, receiver_thread, (LPVOID) thread_args, 0, &receiver_id)) == NULL) ||
((threads [2] = CreateThread(NULL, 0, serverconn_thread, (LPVOID) thread_args, 0, &serverconn_id)) == NULL)
)
{
IO_print_line("Initialization error");
return FALSE;
}
printer_thread、receiver_thread 和 serverconn_thread 是这样定义的函数:
int serverconn_thread(LPVOID args);
Visual Studio 编译器给了我这个错误:
Error C2440 'function': cannot convert from 'int (__cdecl *)(LPVOID)' to 'LPTHREAD_START_ROUTINE'
我真的不明白,因为我认为我已经完全做到了what the official documentation suggests。
不,将线程函数的返回类型更改为DWORD 并不能解决任何问题,错误只会更改为:
Error C2440 'function': cannot convert from 'DWORD (__cdecl *)(LPVOID)' to 'LPTHREAD_START_ROUTINE'
奇怪的是,如果我这样改变它:
if(
((threads [0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) &printer_thread, (LPVOID) thread_args, 0, &printer_id)) == NULL) ||
((recv_thread = threads [1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) &receiver_thread, (LPVOID) thread_args, 0, &receiver_id)) == NULL) ||
((threads [2] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) &serverconn_thread, (LPVOID) thread_args, 0, &serverconn_id)) == NULL)
)
使用强制转换,编译器是可以的,但我认为以这种方式强制它不是一个好主意。我该如何解决这个问题?
【问题讨论】:
-
那微软官方的例子为什么要配
DWORD WINAPI MyThreadFunction( LPVOID lpParam )? -
@EärendilBaggins
WINAPI只是__stdcall的宏 -
WINAPI宏扩展为__stdcall。你也可以在这里使用CALLBACK宏。这一切都一样 -
不推荐使用
WINAPI吗?当我使用HANDLE WINAPI时,我收到了来自编译器的警告 -
因为 __stdcall 是调用约定。仅对功能有意义。当你声明
HANDLE WINAPI h;- 这真的是不合时宜
标签: c visual-studio winapi