循环的时候发送不同消息出错!Up有分!

TwoChars001 2003-05-07 07:26:27
循环如下所示(出现在线程中):
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却没有这个问题不知是为何?谢谢。
...全文
21 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kaye 2003-05-07
  • 打赏
  • 举报
回复
关键问题是Post的时候,建议改用PostThreadMessage
lbird 2003-05-07
  • 打赏
  • 举报
回复
这是个常见的问题:
我看你的消息函数定义有问题,
如果是ON_MESSAGE()消息函数的参数不能为空
Kaye 2003-05-07
  • 打赏
  • 举报
回复
PostMessage()将消息放进消息队列,应该不存在放多个消息不行的问题!
不过你这个线程是否安全?大部分的非法操作都是线程安全造成的
是不是应该加一个CCriticalSection保证线程的安全!
lshadow 2003-05-07
  • 打赏
  • 举报
回复
::PostMessage 是发送了以后直接返回,可能还没有执行就已经有了下一次的 PostMessage了
建议用SendMessage,当然没有仔细看你的程序可否用SendMessage
syl08341 2003-05-07
  • 打赏
  • 举报
回复
up
superS 2003-05-07
  • 打赏
  • 举报
回复
你说的哦。
up!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧