MFC:OnTimer()会不会打断其余的函数
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在另一个线程运行啊,没有打断,各运行各的
[解决办法]这妹子或者是哥们不止一次这样了 习惯了...
[解决办法]简单来讲,我就是想搞清楚程序何时会调用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();
}
}
}