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

问题:我使用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),如果想骂人,请发信给版主。 <!--article end-->

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值