2016-05-19 57 views
2

私は、Visual Studio 2013でMFCプログラムを書いていますし、私は2つの次のエラーエラー:C2893 '関数テンプレート特化に失敗しました。' 'のstd ::の起動'

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

ここでマルチスレッド化することはほとんどありません。タイマーを使用してください([CWnd :: SetTimer](https://msdn.microsoft.com/en-us/library/49313fdf.aspx)を参照)、すべてを単一のスレッドに保ちます。追加ボーナス:現在の時刻を更新するだけで、CPUコア全体を焼き付けることはありません。そして、あなたは実際には、タスクマネージャーに行くことなく、あなたのプロセスを閉じることができます。 – IInspectable

答えて

4

ファンクションtask1は、単一の引数(スレッド本体として使用されます)を受け取りますが、t1コンストラクタではnoneを渡します。 std::invokeメソッドの引数を持たない関数task1をコンパイラが作成できません。

std::thread t1(task1, std::ref(dlg));のようなコールコンストラクタを修正するには、dlgExperimentTabです。 std::refは、参照によってスレッドにdlgが確実に渡されます。

BTW:他のスレッドからMFCコンポーネントを更新すると、データ競合が発生する可能性があります。また、 - while(true)スレッドは、秒の解像度でタイマーの1秒間に複数回更新することによってCPUの100%を消費します。

+0

迅速な対応をありがとう!私はあなたのソリューションを試しましたが、エラー 'エラー\t C2280 \t 'ExperimentTab :: ExperimentTab(const ExperimentTab&)':削除された関数を参照しようとしています –

+0

@LiamP - 答え更新 – Hcorg

+0

多分私はやっていませんこの権利は...しかし、今では未解決の外部シンボルLNK2019 –

関連する問題