C++ 定时,不用循环如何实现

s446721902 2010-01-05 06:07:38
c++控制台定时,能每隔3秒输出一下,不用我下面这种循环结构如何实现?
void CALLBACK timer(HWND   hwnd, UINT  uMsg,UINT  idEvent,DWORD  dwTime)      //CALLBACK
{
printf("hello!\n");
return;
}

int main()
{
MSG msg;
int send = SetTimer(NULL, 0, 3000, (TIMERPROC)timer); //每隔3秒调用一次timer函数。
while(1)
{
GetMessage (&msg, NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
KillTimer(NULL, send);
return 0;
}

是要开线程吗?
...全文
305 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
s446721902 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 chenyu2202863 的回复:]
楼主,你去vckbase看看,上面有你需要的。
[/Quote]
先谢谢啦,我现在想要实现的是非窗口下的定时,但是大部分方法都是在消息循环,像mfc下的settimer和ontimer这样的定时,而不影响程序的其他功能该如何实现呢?
chenyu2202863 2010-01-06
  • 打赏
  • 举报
回复
楼主,你去vckbase看看,上面有你需要的。
s446721902 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 do_fork 的回复:]
显然要调用系统调用,让进程睡眠,不然CPU100%还不被骂死
[/Quote]
系统调用?是调用系统api函数吗?CreateWaitableTimer也可以实现定时。
赵4老师 2010-01-06
  • 打赏
  • 举报
回复
Sleep(3000);
do_fork 2010-01-05
  • 打赏
  • 举报
回复
显然要调用系统调用,让进程睡眠,不然CPU100%还不被骂死
giant1st 2010-01-05
  • 打赏
  • 举报
回复
此处的while 是 必须的吧?

while使得执行时间变长了,有些情况下,引入一个很大的hash表,牺牲空间来节省时间,但此题貌似很难用得上
s446721902 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 loaden 的回复:]
[/Quote]
谢谢老邓!
老邓 2010-01-05
  • 打赏
  • 举报
回复
其实,有些VS的快捷键,使用起来也并不方便。
所以,建议只修改一些常用的快捷键。如果不常用,就无所谓了。
老邓 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sammylan 的回复:]
请用CreateTimerQueue&&CreateTimerQueueTimer
[/Quote]这是内核定时器,使用起来并不是太方便。
VC可以直接编译通过,但MinGW需要LoadLibrary才能使用。
当然,效率很高。
老邓 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 s446721902 的回复:]
引用 1 楼 loaden 的回复:
不用。这样就可以。只是,是个死循环,要改下消息处理。

老邓,怎么处理啊,指点一二,感激不尽!
[/Quote]
MSG msg;
while (int ret = ::GetMessage(&msg, NULL, 0, 0) != 0)
{
if (ret == -1) break; // handle the error and possibly exit
else
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}

return static_cast<int>(msg.wParam);

将消息循环部分替换成这样。
在Timer内随时可以PostQuitMessage(0)来退出程序。
SammyLan 2010-01-05
  • 打赏
  • 举报
回复
请用CreateTimerQueue&&CreateTimerQueueTimer
Dolphin_001 2010-01-05
  • 打赏
  • 举报
回复
还是要用while,只是time改成sleep,这样就不用抢占cpu时间
s446721902 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 loaden 的回复:]
不用。这样就可以。只是,是个死循环,要改下消息处理。
[/Quote]
老邓,怎么处理啊,指点一二,感激不尽!
老邓 2010-01-05
  • 打赏
  • 举报
回复
不用。这样就可以。只是,是个死循环,要改下消息处理。

64,641

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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