//}}AFX_MSG_MAP
ON_MESSAGE(WM_TEST,OnTest)
END_MESSAGE_MAP()
//用户界面线程为:
LRESULTCMyUIThread::OnTest(WPARAMwParam,LPARAMlParam)
{
//...
//处理
SetEvent((HANDLE)lParam);
return0L;
}
------Solutions------
tolovelypengpeng(鹏鹏):
现在只能认为你的消息定义机制出了问题,为你重新定义了一个用户界面线程,我的测试程序通过。还有问题吗?
------Solutions------
应该这样做,主线程要发送两个事件:1是进度事件,2是主线程结束事件。在界面线程里,应该使用MsgWaitForMultipleObjects等待两个事件,当界面线程等到进度事件时,就去刷新进度条,然后继续循环等待。当界面线程等到主线程结束事件时,界面线程退出。线程阻塞时,不能使用消息。
------Solutions------
切记切记,
向有界面的线程不要PostThreadMessage,因为,任何一个界面线程的模态消息循环都会丢掉该消息。所以要用PostMessage向主窗口发消息,并且写成
while(!PostMessge(...));的形式,保证能收到。
-----------------------
我歌月徘徊,我舞影凌乱
-----------------------
------Solutions------
TOsunbo():
能发实例一个给我吗,我怎么也通不过。
lovelypengpeng@eyou.com
------Solutions------
tolovelypengpeng(鹏鹏):
没问题,别忘了给分
------Solutions------
基本同意sunbo的看法。我想应是你的wait函数阻塞了消息循环了,把主线程的waitxxx()改为以下的代码试试:
while(1)
{
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if(WaitForSingleObject(m_Event,0)!=WAIT_TIMEOUT)
{
break;
}
}
------Solutions------
但是主线程和用户界面线程是运行在两个不同的线程里面的啊,
我的理解是因为它们都有自己的主窗口,所以它们都有自己的消息队列和
消息循环。在主线程里面的阻塞不应该影响到辅助线程
------Solutions------
试试这样:
m_hEvent改为g_hEvent(全局变量),
主线程为:
{
ResetEvent(g_hEvent);
WaitForSingleObject(g_hEvent,INFINITE);
}
用户界面线程为:
LRESULTOnTest(WPARAMwParam,LPARAMlParam)
{
...//处理
SetEvent(g_hEvent);
return0L;
}
------Solutions------
tolovelypengpeng(鹏鹏):
你上面的理解没错,可你的程序肯定在某处出了错。每种设计方式都有他的优缺点,要具体问题具体分析。
举个很简单的例子:如果辅线程给主线程的窗口::SendMessage(),主线程处理这个消息时程序出了问题一直没返回,辅线程的窗口不死在那儿才怪呢!也也可能由于别的同步问题会造成死锁。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-23463-7.html
特别是常规潜艇世界第一