关于Timer的回调函数的问题

SKy_kid 2009-07-07 06:53:11
VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
MessageBox(NULL, L"Timer2 Arrive", NULL, NULL);
}

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
SetTimer(NULL, 100, 5000, TimerProc);
//用while循环阻塞
while(1)
{Sleep(100);}
return 0;
}
这里Timer的callback一直不会被调用。
但用MessageBox阻塞,Timer的callback就会被调到
code如下:
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
SetTimer(NULL, 100, 5000, TimerProc);
//用while循环阻塞
MessageBox(NULL, L"Timer", NULL, NULL);
return 0;
}
那是不是说明要调用Timer就一定要有消息循环?那如果在没有消息循环的情况下想用Timer怎么办?只能建线程sleep么?
...全文
178 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
SKy_kid 2009-07-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zgl7903 的回复:]
参考我的博客文章
http://blog.csdn.net/zgl7903/archive/2008/06/25/2584675.aspx
[/Quote]
TimerSetEvent 在msdn上的说明This function is obsolete,不过提到一个替代的函数CreateTimerQueueTimer,我先去试试。
SKy_kid 2009-07-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Gothic_girl 的回复:]
如果在没有消息循环的情况下想用Timer怎么办
==================
自己创建消息循环
[/Quote]
现实情况是我在目前工程里不可能自己去专门为了timer创建一个消息循环~~~看来还是只能创线程处理了。
p.s.上面的引用引错了,应该是6楼的 > <。
SKy_kid 2009-07-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Gothic_girl 的回复:]
如果在没有消息循环的情况下想用Timer怎么办
==================
自己创建消息循环
[/Quote]
改成while(1)
{
;
}
在双核环境下执行,CPU占用率50%多一点,但TimerProc还是没有被执行到,看来还是和消息回路有关。
如果要求不能创建自己的消息循环是不是意味着没办法用到Timer呢?
这和msdn上的说明就有些不合啊。。。如果SetTimer第一个para传NULL的话应该创建一个以nIDEvent标志的全局的timer吧~~
而且上例中setTimer返回值是非0的,也应该说明创建成功,但proc就是调不到。如果设计得和消息回路相关的话那非窗口ap不是根本没办法用timer。
udknight 2009-07-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 stjay 的回复:]
SetTimer(NULL, 100, 5000, TimerProc);
第一个参数为NULL,没设置消息窗体

while(1)
{Sleep(100);}
死循环+sleep...
明白用意,不想程序直接退出而又想测试SetTimer
应该是这里使主线程没机会去执行TimerProc
[/Quote]
正解
stjay 2009-07-07
  • 打赏
  • 举报
回复
SetTimer(NULL, 100, 5000, TimerProc);
第一个参数为NULL,没设置消息窗体

while(1)
{Sleep(100);}
死循环+sleep...
明白用意,不想程序直接退出而又想测试SetTimer
应该是这里使主线程没机会去执行TimerProc
Gothic_girl 2009-07-07
  • 打赏
  • 举报
回复
如果在没有消息循环的情况下想用Timer怎么办
==================
自己创建消息循环
zgl7903 2009-07-07
  • 打赏
  • 举报
回复
参考我的博客文章
http://blog.csdn.net/zgl7903/archive/2008/06/25/2584675.aspx
  • 打赏
  • 举报
回复
#include <windows.h>
#include <iostream>
using namespace std;

static BOOL bExitApp = FALSE;
const UINT uiTimerID = 10;

VOID CALLBACK FooTimerFun( HWND, UINT, UINT, DWORD )
{
static int nCount = 0;
cout << "Timer Function , nCount = " << nCount ++ << endl;
if( nCount > 20 )
bExitApp = TRUE;
}

int main()
{
MSG msgFoo;
SetTimer( NULL , uiTimerID , 100 , FooTimerFun );
while( !bExitApp && GetMessage( &msgFoo , NULL , 0 , 0 ) )
{
TranslateMessage( &msgFoo );
DispatchMessage( &msgFoo );
}
KillTimer( NULL , uiTimerID );
return 0;
}
  • 打赏
  • 举报
回复
MSG tMsg;
// 创建消息队列
::PeekMessage(&tMsg, NULL, 0, 0, PM_NOREMOVE);
// 进入消息循环
while(::GetMessage(&tMsg, NULL, 0, 0))
{
switch(tMsg.message)
{
case xxx:
break;
...
default:
::TranslateMessage(&tMsg);
::DispatchMessage(&tMsg);
break;
}
oyljerry 2009-07-07
  • 打赏
  • 举报
回复
Timer其实就是用WM_TIMER消息来实现的,所以需要消息循环,可以自己创建一个消息循环

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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