![]() |
1
3
使用对象指针作为回调函数参数的概念本身就不错。但是,显然需要在最后一个回调退出后开始销毁。
所以,我不会把计时器抽象化,从中派生出来。我会用另一个抽象类
这样,你就可以确保毁灭不会在你说了之后才开始。 第二件事是,你必须等待最后一个计时器事件耗尽。根据 MSDN doc ,你可以打电话
|
![]() |
2
2
调用DeleteTimerQueueTimer时,请确保传递的句柄值无效 对于完成事件。这将阻塞析构函数,直到所有挂起的回调完成或取消。 例如
这意味着您的代码将阻塞,直到所有计时器回调完成或取消。你可以像往常一样继续破坏。但有一点需要注意:不能从同一个计时器回调调用deleteTimerQueueTimer,否则将死锁。 我相信这本身就足以防止你所经历的种族状况。 |
![]() |
3
0
对于继承模型,您几乎肯定不能这样做。主要问题是,在输入基类构造函数时,派生对象已经无效,但计时器可能会触发,并且没有任何东西阻止它尝试虚拟函数调用,这将导致未定义的行为。 我认为这样做的方法就是这样包装。关键是要确保尝试发送“超时”事件时不存在竞争条件。 这个实现仍然有一个缺陷。当Timer对象开始被删除时,A Timer事件可能正在等待。析构函数可以释放互斥量,然后在计时器线程等待互斥量时销毁互斥量。我们已经阻止了“超时”事件分派中的竞争,但是线程等待被破坏的互斥体的行为取决于互斥体的实现。
|
![]() |
AryA Derakhshan · 在指定的时间重复循环 3 年前 |
|
user8105388 · If语句不与计时器一起工作 6 年前 |
![]() |
Don · 无限循环崩溃,但不在更新函数中 7 年前 |
![]() |
user9769106 · 绘制形状C的路径# 7 年前 |
![]() |
SPlatten · MSVC 2008更好的时机? 7 年前 |