首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

MFC:OnTimer()会不会打断其余的函数

2013-07-01 
MFC:OnTimer()会不会打断其他的函数?在VS2005的环境下void CMyClass::BTN1Clicked(){if(condition){dosome

MFC:OnTimer()会不会打断其他的函数?
在VS2005的环境下


void CMyClass::BTN1Clicked()
{
    if(condition)
    {
         dosomething;
         MessageBox(...);
         return;
    }
}

void CMyClass::OnTimer(UINT_PTR nIDEvent)
{
    if(nIDEvent == 1)
    {
        dosomething;
    }
    CDialog::OnTimer(nIDEvent);
}

如果在MessageBox()处设断点,发现BTN1Clicked()函数执行到MessageBox()处时转而执行OnTimer(),这是怎么回事?难道OnTimer还能打断其他的函数吗? MFC OnTimer MessageBox
[解决办法]
MFC:OnTimer在另一个线程运行啊,没有打断,各运行各的


[解决办法]
引用:
Quote: 引用:

MFC:OnTimer在另一个线程运行啊,没有打断,各运行各的

谁说在另一个线程运行


这妹子或者是哥们不止一次这样了  习惯了...
[解决办法]
引用:
简单来讲,我就是想搞清楚程序何时会调用OnTimer(),要是任何情况下都能调用那就太坑爹了。
MSDN上说:
引用
The DispatchMessage Windows function sends a WM_TIMER message when no other messages are in the application's message queue.

这句话的意思是说当应用程序消息队列中没有其他消息时,才会调用OnTimer()吧?也就是在必须是其他的消息响应函数执行完才有可能调用OnTimer()吧?而不可能是例如BTN1Clicked()函数执行一半,转而调用OnTimer()函数?不知我的理解是否正确?


你的理解是正确的.确实如此,所以WM_TIMER定时器机制不能保证2次调用OnTimer的间隔是严格的设定的值.
[解决办法]
timer 中断的 优先度 为 倒数 第 2. (>OnPaint)
click 消息的 优先度 > timer , 所以 一定是 click 先执行,并要 执行完。
[解决办法]
MessageBox相对于一个模态对话框,是会阻塞父窗口的一些消息,注意是一些消息,不是所有消息
[解决办法]
同一线程不用考虑函数被中断,总会执行完了这个函数,才能通过调度执行其它函数。

至于OnTimer,我想大概可以这样认为,最初由系统线程产生,然后PostMessage WM_TIMER 到你的界面线程的消息队列(多线程读取消息队列有个多线程同步), 然后界面线程取出回调给你注册的函数。

//比如你的响应函数
void OnTimer();
//系统调用
int GetMessageFromQueue()
{
        //取队列消息
   switch(...)
   {
    case WM_TIMER:
        {
          OnTimer();
         }
   }
}

热点排行