2016-08-26 1 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(); 
} 

이것은 VC++에서 MFC를 사용하는 샘플 코드이며 작업자 스레드를 사용하여 작업을 완료하고 결과를 컨트롤에 보내려고합니다. 어느 것이 바람직하거나 다른 어떤 문제를 해결할 것입니까?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가 구현되는 방법에 따라 MFC가 주장 할 수도 있고 그렇지 않을 수도 있습니다. this answer도 참조하십시오. 그래서 첫 번째 사건은 배제됩니다.

메시지 대기열을 사용하는 것이 안전하고 올바른 방법입니다. 다른 스레드에서 UI를 업데이트하는 방법은 this thread을 참조하십시오.