我正在编写一个事件处理函数f(d)
,它接收一些数据d
,并且必须采取行动X(d)
,然后睡眠100毫秒,然后采取另一个行动Y(d)
。我会把它实现为:
void f(d)
{
X(d);
Sleep(100);
Y(d);
}
但是,f(d)
是从单线程事件处理程序调用的,因此Sleep(100)是不可接受的。
我想做以下事情:
void f(d)
{
X(d);
ScheduleOneShotTimer(Y,d,100);
}
我可以通过为每个调用创建一个新线程,将数据作为线程参数传递,并在执行ScheduleOneShotTimer
之前调用Sleep
来实现Y(d)
。但是,由于此事件每秒最多可能发生100次,因此我担心创建破坏所有这些线程所涉及的开销。
最好是对“一次性计时器”有操作系统级支持,但我不认为这是CE的情况。我知道SetTimer,但这不适用于我,因为我正在编写一个没有消息循环的“控制台应用程序”。
有关如何构建此建议的任何其他建议将不胜感激。
答案 0 :(得分:6)
调用timeSetEvent
API(我知道一个完全不直观的API名称)。使用回调函数和TIME_ONESHOT
参数。
答案 1 :(得分:0)
我创建了一个线程,它将保留时间戳 - 回调对的队列,休眠100毫秒(或更小的值),然后执行所有已过去的回调。 OFC具有所有线程间同步(在关键部分上互锁等)。
这是一种注重表现的解决方案,而不是精确导向的解决方案。随着回调的累积,执行时间可能会超过100毫秒。但是因为你用Wait测量时间(这不准确),我想这可能已经足够了。