2016-08-26 16 views
2
//Case I : (It works but not sure if it is safe . Is it because the windows 
      messages are handle in a process queue already?) 
void MyDlg::OnClickButton1() 
{ 
    std::thread([]() 
    { 
      // some long computation here 

     SetDlgItemText(IDC_STATIC_TEXT, L"Updated"); 
    }).detach(); 
} 



//Case II : (It works . But is the process_queue redundant) 
void MyDlg::OnClickButton1() 
{ 
    std::thread([]() 
    { 
      // some long computation here 

     command_node node = 
     command_factory("SetDlgItemText",IDC_STATIC_TEXT, "Updated"); 

     SendMessageToMyProcessQueue(node);   
    }).detach(); 
} 
void MyDlg::OnPaint() 
{ 
     ExecuteFromMyProcessQueue(); 
     CDialogEx::OnPaint(); 
} 

これはMFCを使用したVC++のサンプルスニペットです。ワーカースレッドを使用してタスクを完了し、その結果をコントロールに送信します。どちらが望ましいか、他の何かの回避策がありますか?MFCでのワーカースレッドの使用

+0

[MFC:別のスレッドからGUIにアクセスしますか?](http://stackoverflow.com/questions/18462347/mfc-accessing-gui-from-another-thread) –

+0

重複しない可能性があります。以前のスレッドは、ケースIのみに関係しており、アドバイザリはMFC GUIスレッドでのワーカースレッドの使用を禁止していました。ケース2では、非同期優先順位キューを使用して状況を回避し、メインのGUIスレッドがポストメッセージを処理できるようにしようとしています – seccpur

答えて

1

メインスレッド以外のスレッドから直接GUIにアクセスすることをお勧めします(または必要です)。 MFCは、それがどのように一貫して実装されているかによって、アサートするかどうかを判断することができます。 this answerも参照してください。だからあなたの最初のケースを除外します。

メッセージキューを使用するのが安全かつ正しい方法です。別のスレッドからUIを更新する方法については、this threadも参照してください。