c++ - C++中定义线程

标签 c++ winapi

如何使用 _beginthreadex() 启动线程,使其执行 void myFunction(wchar_t *param);?我尝试使用这个:

_beginthread(NULL, 0, myFunction, L"someParam", 0, &ThreadID);

但是有编译错误:

error C2664: 'beginthreadex' : cannot convert parameter 3 from 'void (_cdecl *)(wchar_t *)' to 'unsigned int (__stdcall *)(void *)'.

我该如何解决这个错误?我似乎可以执行 _beginthread((void(*)(void*))myFunction, 0 , (void *)L"someParam");。但是对于 _beginthreadex() 这些转换似乎不起作用。做什么 我需要去做? 此代码不输出任何内容。怎么了?

unsigned int __stdcall myFunction( void *someParam )
{
    printf("Hello world!");
    return 0;
}


int _tmain(int argc, _TCHAR* argv[])
{
    _beginthreadex(NULL, 0, myFunction, L"param", 0, NULL);
    return 0;
}

最佳答案

_beginthreadex 需要一个使用 __stdcall calling convention 的函数,而不是默认的 __cdecl 调用约定。要修复它,请使用 __stdcall 调用约定声明您的线程过程:

unsigned int __stdcall myFunction(void *arg)
{
    ...
}

不要将您传递的函数指针转换为 _beginthread_beginthreadex:a function pointer cast is a bug waiting to happen .

关于c++ - C++中定义线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12939220/

相关文章:

c++ - 平均值、RMS 和过零数数组 c++

c++ - 如何使用 IDirectManipulationViewport::SetViewportRect?

windows - 以编程方式读取本地密码策略

winapi - WM_KEYDOWN 重复计数?

c++ - 需要帮助创建 Windows dll

c++ - 这是使用docker开发多层C/C++应用程序的好方法吗?

C++ 设计(基类中的行为,派生类中提供的私有(private)成员)

c++ - SFML程序崩溃,窗口标题中包含非ASCII字符

c++ - 如何在 solaris 中使用 mkdtemp

c# - 有什么方法可以在不选择它的情况下从另一个程序复制文本吗?