2011-06-09 69 views
1

我需要在使用某些對話框的MFC應用程序中使用AfxBeginThread來創建線程,但因爲線程函數在類內部,所以我必須將其設置爲靜態,然後我無法使用任何控件,因爲它們不是靜態的,即使我將它們設置爲靜態,我也會得到一些鏈接器錯誤。創建使用對話框的線程

有人能告訴我它是如何實現這個的正確方法嗎?我真的需要去控制靜電嗎?或者有沒有其他方法可以做到這一點?

這是錯誤的(不帶靜電)

error C2228: left of '.AddString' must have class/struct/union 

使用靜態:

unresolved external symbol "public: static class CListBox CsearchDlg::m_musicList" ([email protected]@@[email protected]@A) 

回答

2

線程函數應該接受你傳遞給AfxBeginThread作爲pParam一個參數,你可以通過有指向你的類的指針,並從線程函數調用你想要的任何類成員函數。我就是這麼做的。

像這樣(僞代碼):

CWinThread* thread = AfxBeginThread(
    MyClass::ThreadFunc, 
    this); 

MyClass::ThreadProc(LPARAM pParam) 
{ 
    MyClass cls = dynamic_cast<MyClass*>(pParam); 
    cls->RealThreadFunc(); 
}; 
+0

哦,所以這樣我可以使我的線程功能全局 – Kobe 2011-06-09 06:57:54

+0

@vBx - 是的,你可以 – littleadv 2011-06-09 06:59:19

+0

謝謝你,你救了我:) – Kobe 2011-06-09 07:00:13

1

它通常不是一個好主意,從二級線程「觸摸」的用戶界面。最好將所有的UI交互都留給主線程,並將消息從輔助線程發佈到主線程。

+0

你如何發佈消息到其他線程?我在搜索計算機中的特定文件並將它們添加到列表框 – Kobe 2011-06-09 07:09:43

+1

@vBx檢查[鏈接](http://www.flounder.com/workerthreads.htm)。它涵蓋了幾乎所有的內容,比如「不要觸摸GUI」,如何通知主GUI有關事件等。 – MikMik 2011-06-09 08:52:48

+0

@ MikMik:感謝您的鏈接 – Kobe 2011-06-09 12:00:00