积极答复者
在DispatchMessage处崩溃,会是什么引起的?

问题
-
Hi,大家好。
我写的一个程序,在主线程下新建了一个工作线程,工作线程里有一个窗口,工作线程的处理函数如下:
unsigned __stdcall ThreadFunc( void *param ) { SAComm sa; MSG msg; BOOL bRet; bRet = PeekMessage( &msg, NULL, 0, 0 , PM_NOREMOVE); sa.init(); while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) { if (bRet == -1) { } else { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; }
SAComm即是从ATL基础来的窗口类,现在的问题是我收到的崩溃报告里显示在DispatchMessage处程序崩溃了。开始我怀疑是因为窗口销毁,但是还有消息没有处理的原因,但是看MSDN说窗口销毁后,GetMessage会返回-1,也就是不会进入DispatchMessage分支。那么到底什么情况下会在DispatchMessage处崩溃呢?请各位了解的朋友帮忙解疑。
答案
-
Hi rancejason,
欢迎来Microsoft的论坛。
关于你的程序崩溃的问题,由于一个程序中有多个线程在同时运行,这些线程都有可能访问全局资源(如全局变量),同时,不同线程在执行上还存在一个时序问题,所以谁先发生,谁后发生,都应该统一管理。否则应用程序的运行就很有可能变得不可预测,甚至导致系统崩溃。
请检查下是否有内存异常。
如果你能提供更详细的信息,你将会得到更有正对性的回答。
如果你还有什么进一步的问题,请让我知道。
Lucy
- 已建议为答案 Yi Feng LiModerator 2010年12月15日 4:44
- 已标记为答案 lucy-liuModerator 2010年12月15日 4:49
全部回复
-
刚才的帖子没有换行,重发一下。
我写的一个程序,在主线程下新建了一个工作线程,工作线程里有一个窗口,工作线程的处理函数如下:
unsigned __stdcall ThreadFunc( void *param ) { SAComm sa; MSG msg; BOOL bRet; while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) { if (bRet == -1) { // handle the error and possibly exit } else { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; }
SAComm即是从ATL基础来的窗口类,现在的问题是我收到的崩溃报告里显示在DispatchMessage处程序崩溃了。
开始我怀疑是因为窗口销毁,但是还有消息没有处理的原因,但是看MSDN说窗口销毁后,GetMessage会返回-1,也就是不会进入
DispatchMessage分支。那么到底什么情况下会在DispatchMessage处崩溃呢?请各位了解的朋友帮忙解疑。
-
Hi rancejason,
欢迎来Microsoft的论坛。
关于你的程序崩溃的问题,由于一个程序中有多个线程在同时运行,这些线程都有可能访问全局资源(如全局变量),同时,不同线程在执行上还存在一个时序问题,所以谁先发生,谁后发生,都应该统一管理。否则应用程序的运行就很有可能变得不可预测,甚至导致系统崩溃。
请检查下是否有内存异常。
如果你能提供更详细的信息,你将会得到更有正对性的回答。
如果你还有什么进一步的问题,请让我知道。
Lucy
- 已建议为答案 Yi Feng LiModerator 2010年12月15日 4:44
- 已标记为答案 lucy-liuModerator 2010年12月15日 4:49
-
Hi francejason,
你的问题解决了吗?如果解决了请把有用的回答标志为答案!
谢谢
Lucy
Lucy Liu [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.