高分求救:请MFC的消息事件方面的高手进来!

bsk 2002-05-13 02:44:56
我现在有一个问题,困惑已久,希望高手解答!
问题是这样的:
在一个多文档程序中,我启动一个线程(该线程类CTestThread派生自CWinThread ),在该线程的run函数里发送一个消息通知主线程(类名为CTestApp)去更新主框架的状态条上面的文字。如下:
int CTestThread::Run()
{
int i=0;
CTestApp * pApp = (CTestApp*)AfxGetApp();
while ( true ){
Sleep(1000);
i++;
pApp->PostThreadMessage(WM_TEST_MESSAGE,i,0);
}

return CWinThread::Run();
}
其中WM_TEST_MESSAGE为自定义的消息ID号。

主线程里的函数如下:
void CTestApp::HandleMessage(WPARAM wParam, LPARAM lParam)
{
CMainFrame * pFrame = (CMainFrame*)AfxGetMainWnd();
CString str;
str.Format("%u",wParam);
pFrame->m_wndStatusBar.SetPaneText(pFrame->m_wndStatusBar.CommandToIndex(ID_INDICATOR_TEST),str);
}
ID_INDICATOR_TEST为自定义的状态栏上的ID号。
程序运行成功。启动CTestThread线程后状态栏上的数字每隔一秒加一。

但问题是现在只要鼠标点击菜单,如点击菜单上的文件,弹出文件的菜单,保持这种状态,则状态栏上的数字就不会变化了(如显示数字6),一旦取消这种选择菜单的状态,则状态栏上的数据就一下子增大了(可能就变为18了)。这证明点击菜单的时候线程还是在运行的,但主线程却没办法及时处理CTestThread发送过来的消息。

请教各位高手:有什么办法可以解决这个问题吗?让点击菜单的时候状态栏上的数字也可以每隔一秒加1。条件是要保持用自己打开的线程发送消息给主线程来更新状态栏上的数字这种方法。

谢谢大家的解答!假如分数不过,可以另加!(我现在一次只能加100分)
...全文
42 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingchar 2002-05-13
  • 打赏
  • 举报
回复
我草草的看了你的文章,可能理会不太清楚,我没有写过这样的程序!
当你弹开一个菜单的时候,主界面当然不会重绘了,主要是界面不绘出的缘故,而非被组塞,,,,来不及处理等的问题,
可能理解错误,
bsk 2002-05-13
  • 打赏
  • 举报
回复
太感谢freelybird了,谢谢!
qiuanhong 2002-05-13
  • 打赏
  • 举报
回复
UP
pfans 2002-05-13
  • 打赏
  • 举报
回复
你在线程中用
SendMessage(hWnd,WM_TEST_MESSAGE,i,0);
试试看。
freelybird 2002-05-13
  • 打赏
  • 举报
回复
这样的解决办法,你可以试试

1 不采用传递线程消息PostThreadMessage(WM_TEST_MESSAGE,i,0);
2 取得主帧窗口句柄HWND(保存起来), PostMessage(hwnd, WM_TEST_MESSAGE,i,0);
3 实现消息处理函数
void CMainFrame::OnTestMessage(WPARAM wParam, LPARAM lParam)
{
CString str;
str.Format("%u",wParam);
this->m_wndStatusBar.SetPaneText(pFrame->m_wndStatusBar.CommandToIndex(ID_INDICATOR_TEST),str);
}

如果这样仍不行,我就无能为力了,因为主线程处理消息队列时(当一个阻塞,其它的当然不能处理)
bsk 2002-05-13
  • 打赏
  • 举报
回复
保持菜单下拉重画时, 这个线程消息处理函数void CTestApp::HandleMessage(WPARAM wParam, LPARAM lParam)就不能进行。
bsk 2002-05-13
  • 打赏
  • 举报
回复
保持菜单下拉重画时, 这个线程消息处理函数没法进行
freelybird 2002-05-13
  • 打赏
  • 举报
回复
up
freelybird 2002-05-13
  • 打赏
  • 举报
回复
这样测试一下, 在void CTestApp::HandleMessage(WPARAM wParam, LPARAM lParam)函数里面设置一个断点. 运行程序,看保持菜单下拉重画时, 这个线程消息处理函数是否还能进行
bsk 2002-05-13
  • 打赏
  • 举报
回复
有没有办法拦截菜单更新消息?
freelybird 2002-05-13
  • 打赏
  • 举报
回复
1 据我分析,这个问题挺难解决的.其实看你的代码,说明你对消息循环机制也非常了解.
2 最有可能是菜单更新消息阻塞了状态条的更新
bsk 2002-05-13
  • 打赏
  • 举报
回复
用OnTimer是可以达到我现在提出来的程序的效果的。不过现在在实际中只能用在自己开的线程里面发送消息给主线程去更新界面。所以没有用OnTimer。
luohx 2002-05-13
  • 打赏
  • 举报
回复
是否可以设定OnTimer()来刷新要显示的部分(如1秒刷新1次),不知是否有效。

16,467

社区成员

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

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

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