循环的时候发送不同消息出错!Up有分!
循环如下所示(出现在线程中):
while(res)
{
::PostMessage(m_MainhWnd,WM_TOTALNUM,NULL,NULL);
......
if(...)
{
::PostMessage(m_MainhWnd,WM_SCANSTATE,(WPARAM)&strPath,NULL);
......
}
else if(...)
{
::PostMessage(m_MainhWnd,WM_TOTALNUM,NULL,NULL);
if(...)
{
::PostMessage(m_MainhWnd,WM_SCANRESULT,(WPARAM)&ff,(LPARAM)&n_Result);
}
}
}
后经过测试,发现问题在 ::PostMessage(m_MainhWnd,WM_SCANSTATE,(WPARAM)&strPath,NULL);和::PostMessage(m_MainhWnd,WM_SCANRESULT,(WPARAM)&ff,(LPARAM)&n_Result);这两个消息发送上,只要把::PostMessage(m_MainhWnd,WM_SCANSTATE,(WPARAM)&strPath,NULL);给注解掉就没有问题了!
这两个消息的处理函数如下:
WM_SCANSTATE消息:
void CPopScannerDlg::OnStateStatic(WPARAM wparam,LPARAM lparam)
{
CCriticalSection g_cs;
g_cs.Lock();//这里锁与不锁没什么变化。
m_State=*((CString *)wparam);//m_State为一个Static控件。
UpdateData(false);
g_cs.Unlock();
// TODO: Add your control notification handler code here
}
WM_SCANRESULT消息:m_ResultList是一个List控件的对象
void CPopScannerDlg::VirusResult(WPARAM wparam,LPARAM lparam)
{
CFileFind *ff=(CFileFind *)wparam;
CString m_Result=*((CString *)lparam);
CCriticalSection g_cs;
g_cs.Lock();//这里锁不锁也没什么区别。
if(m_Result!="OK")
{
m_ResultList.SetImageList(&m_VirusIcon, LVSIL_SMALL);
m_ResultList.InsertItem(FILENAME,ff->GetFileName());
m_ResultList.SetItemText(0,FILEPATH,ff->GetFilePath());
if(m_Result=="I/O Error")
{
m_ErrorNum++;
UpdateData(false);
m_ResultList.SetItemText(0,FILESTATE,"I/O Error:");
}
else
{
//m_FoundNum++;
// UpdateData(false);
m_ResultList.SetItemText(0,2,"Infected:");
m_ResultList.SetItemText(0,VIRUSNAME,m_Result);
}
}
g_cs.Unlock();
}
当我在程序中将WM_SCANSTATE注解掉,程序就没有问题了,但如果不注解掉,那么如果运行程序时拖动窗口,或者对窗口发送一些消息,则程序很可能非法掉!!!
另外还有一个问题,我生成的Debug和Release不一样,我看过文档,但多是解决不能运行,或者运行错误的问题。我的问题在与Release版本在关闭窗口后,鼠标会变成等待状态一会(大约0.5秒),之后连续出现两个非法操作,之后程序才结束。感觉像是在析构掉所占空间。Debug却没有这个问题不知是为何?谢谢。