sendmessage与postmessage的区别是,postmessage是将消息发送到消息队列里就返回,而sendmessage是不经过消息队列的,并且消息处理完了才会返回。而今天就是那么巧我用sendmessage导致了一个类似死锁的问题。
窗口初始化的时候开启了一个线程来加载一些数据,线程里面有一个函数叫ReadData,是一个很耗时的操作
ReadData()
{
.......
for(int i=0; i<num;i++)
{
....
if(m_bThreadCancel == TRUE)//如果标志位置为真,让线程返回
return;
this->sendmessage(.....)
....
}
}
由于加载的数据可能比较多,用户不想等了,想关掉窗口,onClose()
onclose()
{
m_bThreadCancel = TRUE;
if(m_pThread != NULL)
{
if (waitforsingleobject(m_pThread->m_hThread,120000) == WAIT_TIEMOUT)
TerminateThread(m_pThread->m_hThread,0x00);//强行终止线程
}
............
CDialog::onclose();
}
结果你猜怎么着,程序运行到ReadData中的sendmessage时停止不动了,为什么呢,因为主线程也在等 执行处理不了这个消息,两边都在等 ,最后等了超过2分钟了,主线程不得不强行终止线程。
解决方法很简单,将sendmessage改成postmessage就行了,所以能不用sendmessage的地方还是不用,除非你想保证消息被处理。