我正在Visual Studio 2013中编写MFC程序,我不断收到以下两个错误
Error C2893 Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...)'
和
Error C2672 'std::invoke': no matching overloaded function found
错误与文件xthread第238行
有关我在c ++ / MFC上相当新,我正在尝试编写一个在后台运行到系统时间的函数。
这是我正在使用的代码:
void task1(ExperimentTab& dlg)
{
while (true)
{
CString showtime = CTime::GetCurrentTime().Format("%H:%M:%S");
int x = dlg.m_showTime.GetWindowTextLengthA();
dlg.m_showTime.SetWindowTextA(_T(""));
dlg.m_showTime.ReplaceSel(showtime, 0);
}
}
void mainThread()
{
std::thread t1(task1);
t1.join();
}
然后按下按钮启动时间,但同样的按钮也用于停止时间。
答案 0 :(得分:5)
函数task1
采用单个参数(用作线程体),但在t1
构造函数中没有传递。
编译器无法在没有方法参数的情况下创建std::invoke
调用task1
函数。
修复它的调用构造函数:std::thread t1(task1, std::ref(dlg));
,其中dlg
是ExperimentTab
。 std::ref
确保dlg
将通过引用传递给线程。
BTW:从其他线程更新MFC组件可能会导致一些数据争用。此外 - while(true)
线程将通过具有第二分辨率的每秒定时器的多次更新消耗100%的CPU。