[问题] 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