【发布时间】:2016-04-25 12:40:17
【问题描述】:
我有一个WM_TIMER 回调函数每 50 毫秒触发一次,在此我创建一个线程只是为了确保 ui 线程不阻塞,这些线程在共享内存上运行,我使用 mutex 使线程安全 对象。
我的问题是,当创建新线程并且较早的线程尚未完成时,它们在到达WaitForSingleObject(ghMutex, INFINITE) 行后进入等待状态,因为内存中的活动线程数将呈指数增长,可能我应该在没有计时器的情况下这样做,但我认为使用计时器可以更好地管理频率。
我还尝试使用线程计数器(告诉活动线程的数量)并在计数器大于零时从回调函数返回,据我了解这不是线程安全的。
我应该怎么做才能让一个线程随时运行,例如,如果一个线程未能获得互斥锁,那么它应该终止而不是等待。
【问题讨论】:
-
你可以用单线程来做,没有 WM_TIMER。你的线程会有一个主循环,在顶部它会使用 GetCurrentTime() 记住开始时间,然后去执行它的任务。执行后检查是否应该 ::Sleep() 这个线程的剩余时间(直到 50 毫秒),或者继续循环。但是你不会同时执行多个线程,所以我不确定这是否是你想要的。
-
@MarcinJędrzejewski 是的,我不需要在任何时候执行多个线程,顺便说一句,性能如何,因为这里我有几个 GetCurrentTime() 和一个 IF 语句。
-
你肯定做错了。单线程是你需要的。大概。我们不知道您的实际问题。
-
@David 我会走这条路
-
如果您的解决方案涉及每 50 毫秒生成一个新线程,那么就大错特错了。希望使用计时器控制频率也不会奏效:计时器是低优先级的,只有在队列中没有任何更高优先级的消息时才会触发。你真的需要重新审视你的设计。至于问题:不知道你的最终目标是什么,它并不是真的有用。