[問題] MFC 在 Thread 中使用控件的相關問題

作者: sd016808 (sd016808)   2015-06-11 20:39:18
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
MFC
問題(Question):
1.在使用AfxBeginThread()時,到底是傳this進去還是傳this->GetSafeHwnd()比較好?
2.如果傳this,要如何知道哪些關於控件的function不能使用? Ex:UpdateData()..
P.S.我知道可以透過SendMessage()去做UpdateData()
3.如果傳HWND,透過FromHandle去拿CWnd,控件的function可以使用。Ex:UpdateData()
但是呼叫AfxBeginThread()的class本身的成員變數卻都沒辦法使用了。Ex:CString...
這樣是正常的嗎?
4.一般如果在Thread裡面要用到控件,例如讀取控件的Value或者設定控件的Value,難道
都是透過送訊息的方式嗎?
餵入的資料(Input):
預期的正確結果(Expected Output):
錯誤結果(Wrong Output):
程式碼(Code):(請善用置底文網頁, 記得排版)
http://codepad.org/2fO7YeNT
補充說明(Supplement):
作者: linotwo (._.)   2015-06-12 12:32:00
GOOGLE: mfc thread update ui
作者: sd016808 (sd016808)   2015-06-12 13:26:00
大部分的文章都說用送訊息的方式去修改UI 是否代表會改變畫面的部分都透過送訊息的方式 而純粹讀取控件的資料的部分可以直接在thread中使用 其實我分不太清楚什麼時候要透過訊息 什麼時候可以直接用 另外透過fromhandle可以直接使用空間的原因 是否是因為它在thread裡建立的一個暫存的對應關係(HWnd to CWnd) 讓CWnd不為空 所以Assert才不會出現?
作者: firose (guest也是也是也是也是也)   2015-06-12 16:33:00
mfc 把對應關係的 handle map 存在 TLS 裡面, 通常 assert應該都是用來確認它沒有跨執行序使用 (跨了 TLS 就找不到)FromHandle 傳回來的只是一個 CTempWnd 相當於 CWnd如果你有一個 class 繼承 CWnd 然後用它傳回物件, 想存取那個 class 特有的資料會引發錯誤, 這是因為 CTempWnd 沒有那些多出來的資料造成的
作者: sd016808 (sd016808)   2015-06-12 18:14:00
感謝F大一語驚醒夢中人!另外我非常推薦這篇文章Inside_MFC_Handle_Maps_and_Temporary_Objects裡面解釋了很多之前不了解的疑問
作者: freaky (jon)   2015-06-13 02:33:00
MFC的source code完全是公開的,有興趣自己看

Links booklink

Contact Us: admin [ a t ] ucptt.com