请教:怎么才能使OnTimer函数全部执行完后,再去执行下一个OnTimer

时间:2021-11-07 17:00:20
我用SetTimer函数写了段代码,但是一个OnTimer函数还没执行完,就产生了下一个OnTimer,如何才能使OnTimer函数全部执行完后,再产生一个WM_TIMER信息

8 个解决方案

#1


ontimer(id)
{
 killtimer(id);
 //...todo:
 settimer(id);
}

#2


要不是多线程的话。这样可以不?
static flag=0;
if (flag) return;

  flag=1;
  //.....
  flag=0;
  return;


#3


Event?

#4


1、 1楼正解
2、 另外说下, 如果你的Timer没有设置回调函数的话(也就是setimer的第3个参数是NULL),
    虽然WM_TIMER的消息已经产生,但是不会执行OnTimer里的代码,
3、 如果说经常性的,你的OnTimer函数还没执行完就有WM_TIMER产生了, 说明你的Timer的时间太短了, 没有什么意义。
4、这一刻,DkMoggy想了很多很多

#5


同意一楼的

#6


KILL掉原来这个定时器就行了

#7


单一线程是不可能的,windows对于界面线程绑定的消息,在消息队列里只会保留1个定时器消息。

比如你有1个定时器 100ms 但是执行时间超过 1000ms ,也就是累计10个WM_TIMER消息,系统会把9个删掉,只保留1个

如果我没记错的话,呵呵,具体可以参考windows核心编程

#8


只要你在OnTimer函数中不去处理消息,是不会执行下一个OnTimer的。

#1


ontimer(id)
{
 killtimer(id);
 //...todo:
 settimer(id);
}

#2


要不是多线程的话。这样可以不?
static flag=0;
if (flag) return;

  flag=1;
  //.....
  flag=0;
  return;


#3


Event?

#4


1、 1楼正解
2、 另外说下, 如果你的Timer没有设置回调函数的话(也就是setimer的第3个参数是NULL),
    虽然WM_TIMER的消息已经产生,但是不会执行OnTimer里的代码,
3、 如果说经常性的,你的OnTimer函数还没执行完就有WM_TIMER产生了, 说明你的Timer的时间太短了, 没有什么意义。
4、这一刻,DkMoggy想了很多很多

#5


同意一楼的

#6


KILL掉原来这个定时器就行了

#7


单一线程是不可能的,windows对于界面线程绑定的消息,在消息队列里只会保留1个定时器消息。

比如你有1个定时器 100ms 但是执行时间超过 1000ms ,也就是累计10个WM_TIMER消息,系统会把9个删掉,只保留1个

如果我没记错的话,呵呵,具体可以参考windows核心编程

#8


只要你在OnTimer函数中不去处理消息,是不会执行下一个OnTimer的。