簡體   English   中英

如何從輔助線程訪問MFC控件?

[英]How to access an MFC control from a worker thread?

從工作線程訪問MFC控件的最佳方法是什么?

MFC慣用的控件訪問方式是什么?

我在下面的方法中閱讀了http://www.flounder.com/workerthreads.htm ,但是我不太喜歡CStringnew ,如何確定CString將被正確deleted

typedef struct tagTP
{
   HWND hwnd;
   int n;
} TP;

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
   // ...
   ON_MESSAGE( UWM_UPDATE_RESULTS, OnUpdateResults )
END_MESSAGE_MAP()

void CMyDlg::OnBnClickedDoWork()
{
   TP* tp = new TP;
   tp->hwnd = m_hWnd;
   tp->n = 42;

   AfxBeginThread( doWork, tp );
}

UINT CMyDlg::doWork(LPVOID p)
{
   TP* tp = reinterpret_cast< TP* >(p);
   CWnd* dlg = FromHandle( tp->hwnd );

   if ( tp->n == 42 ) {   
      CString* s = new CString( "Is the Answer to the Ultimate Question of Life, the Universe, and Everything" );
      dlg->PostMessage( UWM_UPDATE_STATUS, 0, reinterpret_cast< LPARAM >(s) );
   }

   return 0;
}

LRESULT CMyDlg::OnUpdateResults(WPARAM,LPARAM lParam)
{
   CString* s = reinterpret_cast<CString *>(lParam);
   m_result.AddString( *s );// m_result is a CListBox
   delete s;
   UpdateData( FALSE );
   return 0;
}

使用PostMessage(..)是正確的。 考慮使用SendMessage(..) -直到完成為止。 傳遞指向新對象的指針很常見-檢查PostMessage(..)的返回值以檢查其是否已發布。

如何確定CString將被正確刪除?

如前所述,檢查PostMessage(..)的返回值,並在退出消息循環的情況下處理整個消息隊列。

通常,只能從創建它們的線程訪問MFC控件。 這就是為什么您找到的樣本經過傳遞消息的額外步驟的原因。 該消息由創建控件的線程接收和處理。

CString已在OnUpdateResults()中正確刪除。

除了@Simon的答案之外,如果您遇到的情況更加復雜,很難確定誰應該刪除CString(或任何類型),請考慮std :: tr1 :: shared_ptr。 它將負責刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM