单线程程序处理消息的方式!
2006-12-06 20:45
148 查看
MFC内部代码是:
MSG message;
while(::GetMessage(&message,NULL,0,0))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
当有消息需要处理的时侯,GetMessage返回,如果没有投递任何消息,则程序挂起,可运行其它程序 。当消息最终到达的时侯,程序被唤起。TranslateMessage函数可以将WM_KEYDOWN消息转换为WM_CHAR;DispatchMessage函数将控件传递给MFC消息转储,由转储来通过消息映射来调用函数。
当应用程序需要运行的时间很长的时侯,就需要在应用程序的虚幻中插入下面的程序段:
MSG message;
while(::PeekMessage(&message,NULL,0,0,PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
这样慢应用程序仍然在运行,不过如果有了消息,它将暂停,调用处理程序,在处理程序退出,慢应用程序继续运行。
void CComputeDLG::OnStrat()
{
// TODO: Add your control notification handler code here
MSG message;
m_nTimer=SetTimer(1,100,NULL);
//ASSERT(m_nTimer!=0);
GetDlgItem(IDC_START)->EnableWindow(FALSE);
volatile int nTemp;
for(m_nCount=0;m_nCount<nMaxCount;m_nCount++)
{
for(nTemp=0;nTemp<100000;nTemp++)
{//这里什么也没有做,空循环
}
if(::PeekMessage(&message,NULL,0,0,PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}//这里当有消息时,暂停执行,转入消息处理,本程序采用的WM_TIMER消息
}
CDialog::OnOK();
}
void CComputeDLG::OnCancel()
{
// TODO: Add extra cleanup here
if(m_nCount==0)
{
CDialog::OnCancel();
}
else
{
m_nCount=nMaxCount;
}
}
void CComputeDLG::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(nIDEvent==1)
{//设置进度条的进度。
CProgressCtrl* pBar=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
pBar->SetRange(0,100);
pBar->SetPos(m_nCount*100/nMaxCount);
}
CDialog::OnTimer(nIDEvent);
}
MSG message;
while(::GetMessage(&message,NULL,0,0))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
当有消息需要处理的时侯,GetMessage返回,如果没有投递任何消息,则程序挂起,可运行其它程序 。当消息最终到达的时侯,程序被唤起。TranslateMessage函数可以将WM_KEYDOWN消息转换为WM_CHAR;DispatchMessage函数将控件传递给MFC消息转储,由转储来通过消息映射来调用函数。
当应用程序需要运行的时间很长的时侯,就需要在应用程序的虚幻中插入下面的程序段:
MSG message;
while(::PeekMessage(&message,NULL,0,0,PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
这样慢应用程序仍然在运行,不过如果有了消息,它将暂停,调用处理程序,在处理程序退出,慢应用程序继续运行。
void CComputeDLG::OnStrat()
{
// TODO: Add your control notification handler code here
MSG message;
m_nTimer=SetTimer(1,100,NULL);
//ASSERT(m_nTimer!=0);
GetDlgItem(IDC_START)->EnableWindow(FALSE);
volatile int nTemp;
for(m_nCount=0;m_nCount<nMaxCount;m_nCount++)
{
for(nTemp=0;nTemp<100000;nTemp++)
{//这里什么也没有做,空循环
}
if(::PeekMessage(&message,NULL,0,0,PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}//这里当有消息时,暂停执行,转入消息处理,本程序采用的WM_TIMER消息
}
CDialog::OnOK();
}
void CComputeDLG::OnCancel()
{
// TODO: Add extra cleanup here
if(m_nCount==0)
{
CDialog::OnCancel();
}
else
{
m_nCount=nMaxCount;
}
}
void CComputeDLG::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(nIDEvent==1)
{//设置进度条的进度。
CProgressCtrl* pBar=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
pBar->SetRange(0,100);
pBar->SetPos(m_nCount*100/nMaxCount);
}
CDialog::OnTimer(nIDEvent);
}
相关文章推荐
- 单线程程序处理消息的方式!
- 单线程程序处理消息的方式!
- MFC消息分类和处理方式以及MFC程序的执行流程
- java.lang.RuntimeException: 将消息发送到死的线程上处理程序的处理程序 (android.os.Handler)
- 批处理方式设置XP系统的服务程序
- DUI程序Demo2(注意拖动程序的边框改变程序界面的大小,OnNcHitTest消息中处理)
- 如何在IDA中找到MFC程序的消息处理函数
- 消息映射范围的处理程序
- Javascript与ASP.NET(一般处理程序)关于URL(get方式)传递中文乱码问题的解决方案
- 【Android游戏开发之十】(优化处理)详细剖析Android Traceview 效率检视工具!分析程序运行速度!并讲解两种创建SDcard方式!
- 【Android游戏开发之十】(优化处理)详细剖析Android Traceview效率检视工具,分析程序运行速度!并讲解两种创建SDcard方式!
- [转贴]使用C#和MSMQ开发消息处理程序
- 第25周-window程序设计(基础篇)-第3章-窗口消息处理程序WndProc
- 控制台如何像windows程序那样处理消息事件
- 浅析Microsoft .net PetShop程序中的购物车和订单处理模块(Profile技术,异步MSMQ消息)
- 完整性和不丢失的方式处理消息 BlockingQueue类
- 下面的程序实现了在利用Handler在新线程当中处理消息的方法
- 使用C#和MSMQ开发消息处理程序
- ActiveMQ消息处理机制-Queue方式
- Linux下,使用C/C++一个简单的消息处理程序