错误:“未能专门化功能模板” C2893'std :: invoke'

Lia*_*m P 4 c++ mfc visual-studio-2013

我在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();
}
Run Code Online (Sandbox Code Playgroud)

然后在按下按钮开始计时时调用此按钮,但是使用同一按钮也可以停止时间。

Hco*_*org 5

函数task1采用单个参数(用作线程主体),但在t1构造函数中未传递任何参数。编译器无法在没有方法参数的情况下创建std::invoke调用task1函数。

要修复它调用构造这样的:std::thread t1(task1, std::ref(dlg));其中dlgExperimentTabstd::ref确保dlg将通过引用传递给线程。

顺便说一句:从其他线程更新MFC组件可能会导致某些数据争用。另外- while(true)线程将每秒以秒分辨率更新多个计时器,从而消耗100%的CPU。