问题:我使用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-->