【发布时间】:2019-07-25 11:17:36
【问题描述】:
我正在使用带有 mingw 的 CodeBlocks,gcc 版本 5.1.0。
我的代码如下所示:
unsigned int __stdcall doWork(void* data)
{
if (napolniDrevo())
{
return 0;
}
else
{
return 1;
}
}
然后在其他函数的其他地方:
HANDLE m_hThread = (HANDLE)_beginthreadex(0, 0, &doWork, 0, 0, 0);
代码运行良好。今天学习了 lambda 表达式,想尝试一下。
所以我删除了函数doWork() 并尝试对:
auto lambda = [](void* data) WINAPI -> unsigned int {if (napolniDrevo()) return 0; else return 1;};
HANDLE m_hThread = (HANDLE)_beginthreadex(0, 0, lambda, 0, 0, 0);
但我得到错误:
||=== Build: Release in CtrlData (compiler: GNU GCC Compiler) ===|
||warning: ./wx_pch.h.gch/Debug_wx_pch_h_gch: not used because `__WXDEBUG__' not defined [-Winvalid-pch]|
C:\Users\M0097932\Desktop\CtrlData\CtrlDataMain.cpp||In member function 'void DataGetterFrame::OnButton2Click(wxCommandEvent&)':|
C:\Users\M0097932\Desktop\CtrlData\CtrlDataMain.cpp|551|error: invalid user-defined conversion from 'DataGetterFrame::OnButton2Click(wxCommandEvent&)::<lambda(void*)>' to 'unsigned int (__attribute__((__stdcall__)) *)(void*)' [-fpermissive]|
C:\Users\M0097932\Desktop\CtrlData\CtrlDataMain.cpp|550|note: candidate is: DataGetterFrame::OnButton2Click(wxCommandEvent&)::<lambda(void*)>::operator unsigned int (*)(void*)() const <near match>|
C:\Users\M0097932\Desktop\CtrlData\CtrlDataMain.cpp|550|note: no known conversion from 'unsigned int (*)(void*)' to 'unsigned int (__attribute__((__stdcall__)) *)(void*)'|
C:\Program Files (x86)\CodeBlocks\MinGW\include\process.h|100|note: initializing argument 3 of 'long unsigned int _beginthreadex(void*, unsigned int, unsigned int (__attribute__((__stdcall__)) *)(void*), void*, unsigned int, unsigned int*)'|
||=== Build failed: 1 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|
我想我必须把 __stdcall 放在某个地方。我还没有通过谷歌搜索找到任何东西。
【问题讨论】:
-
既然你有 lambda,我建议你也学习一下
std::thread类。 -
@Someprogrammerdude 谢谢,但我必须使用 _beginthreadex。
-
不,你没有:)
标签: c++ multithreading lambda mingw