1. 程式人生 > >子執行緒中如何呼叫對話方塊的變數和函式

子執行緒中如何呼叫對話方塊的變數和函式

因為執行緒函式是全域性的,而對話方塊的成員變數屬於對話方塊類,所以不能呼叫,若想使用,一方面可以將對話方塊指標作為引數傳遞給執行緒,另一方面可以在子執行緒中向主執行緒傳送訊息,然後在訊息響應函式裡呼叫想使用的對話方塊的函式和變數。

傳遞指標引數的方法:在對話方塊的初始化函式中呼叫子執行緒,將對話方塊指標this傳遞給執行緒pOdometerQueryThread=AfxBeginThread(&OdometerQueryThreadProc,this,
THREAD_PRIORITY_NORMAL,0,0,NULL);
在子執行緒中,
UINT OdometerQueryThreadProc(LPVOID pParam)
{
CRobotcontrolDlg* dlg;
dlg=(CRobotcontrolDlg*)pParam;
while(m_bActive_SensorThread)
{
m_drive.drive_distance_query(&(dlg->m_comm1_Drive));
}
return 0;
}
網上好多資料說傳遞指標會很不安全,所謂“不安全”是因為兩個執行緒訪問同一個物件可能會有衝突,其實不只是對話方塊指標,凡是多個執行緒共用同一個東東都有這種可能,自己要知道哪些操作可能會發生衝突,並設法避免。
這個是 MFC 的一個雷區
=================================================
MfC各物件和win32 handles之間的對映關係記錄線上程區域性儲存之中,因此,你沒有辦法把   
一個MFC物件從某執行緒手上交到另一個執行緒手上,你也不能夠線上程之間傳遞MFC物件指標   
。。。。。。你不能夠放一個指標到結構中,而該結構被一個worker執行緒使用。你不能夠把   
一個指向CDialog或CView的指標交給另一個執行緒。當你需要呼叫view或document中的一個成   
員函式,特別象UpdateAllView這樣的函式時,上述的限制很快會惡化。   
-----摘自《win32多執行緒程式設計》p294   
==================================================
比較安全的做法是傳送訊息。

可以自定義一個訊息,線上程函式中利用SendMessage or PostMessage函式給主視窗傳送訊息,然後在視窗類的實現檔案中定義訊息處理函式即可,主要有以下步驟:

在對話方塊類的實現檔案中:
1.定義訊息
#define WM_MYMESSAGE WM_USER+100
2.在BEGIN_MESSAGE_MAP巨集中增加一個入口將訊息和函式關聯起來
BEGIN_MESSAGE_MAP(CLmsTestDlg, CDialog)
//{{AFX_MSG_MAP(CLmsTestDlg)
..............................
ON_MESSAGE(WM_MYMESSAGE,OnMyMessage) 
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
3.定義訊息處理函式
LRESULT CLmsTestDlg::OnMyMessage(WPARAM wParam,LPARAM lParam)
{}

在對話方塊類的標頭檔案中宣告訊息函式:
afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam);

這樣的話就可以了,解決了執行緒函式中不能使用成員變數的問