用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心编程技巧Visual C++

土法解决工作线程中调用MFC对话框

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-03-16 20:27:12

问题:我使用createthread直接生成了一个线程,然后企图在该线程中直接调用CDialog派生类,结果是可以显示,但是当有消息比如LButtonDown或鼠标移动到标题栏时立刻出错,调试进去,发现以下声明:

(wincore.cpp)// Note: if either of the above asserts fire and you are// writing a multithreaded application, it is likely that// you have passed a C++ object from one thread to another// and have used that object in a way that was not intended.// (only simple inline wrapper functions should be used)//// In general, CWnd objects should be passed by HWND from// one thread to another.  The receiving thread can wrap// the HWND with a CWnd object by using CWnd::FromHandle.//// It is dangerous to pass C++ objects from one thread to// another, unless the objects are designed to be used in// such a manner.

其实我并没有从主线程中传任何变量给子线程,问题可能出在我没有使用派生线程类的方法去使用线程,在全局线程函数中使用MFC的派生类,导致新建窗口没有缺省的父窗口------导致消息无法正常的流转和传递,即对话框窗口无法正常的接收消息也无法处理上溯的消息,所以造成致命错误。所以在创建线程的时候,我把窗口句柄当作参数传给子线程,如下所示:

 ::CreateThread(NULL,0,ListenMessage,this->m_hWnd,0,&ClientThreadId);在子线程内接受句柄,并传给CDialog派生类:         HWND hWnd=(HWND)lpArg;         CWnd* wnd=CWnd::FromHandle(hWnd);         CxxxxDlg myDlg(wnd);然后编译(PNT 4.0  VC6),运行良好。

一般来说全部使用MFC,在线程的使用中是不会出现这种情况的,我由于准备不够充分,造成这种尴尬的局面,一般是应该避免的,使用这种方式创建线程时,应尽量避免有界面的线程,单纯的工作线程工作同样稳定高效。另外为了保证不出问题,对话框的属性为pop and none border,no system menu.

重要声明,该方法有猜测的成分,本人不对其作承诺,如果你不幸向我一样骑虎难下,希望该方法对你有所帮助。

如果对你有帮助,请发邮件给我(cd_yuan@sina.com),如果想骂人,请发信给版主。


Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:30,109.38000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号