我有一个线程,需要在生成后立即发送消息(使用SendInput发送的模拟鼠标事件)。我希望这发生在没有睡眠的循环中;添加任何睡眠伤害性能,因为我基本上希望事件一旦生成就立即进入事件循环。当然我也不希望消费者线程中的循环占用所有的cpu,所以我不能让它继续运行,虽然这给了我很好的性能。
据我了解这一点,任务是让消费线程等待一些信号表明生产线程提供了调度(?)但是如何做到最好?如果我想让两个线程相互排斥,我想我需要两个互斥量之类的东西;一旦消费者恢复运营,消费者会等待生产者和生产者继续吗?到目前为止还没有真正实现这一点,我真的不确定如何最好地做到这一点; CriticalSections与互斥体有什么不同?
我不想从生产者线程调用SendInput的原因是该线程('主线程'?)实际运行以响应鼠标移动消息,由鼠标钩子拦截,并发送更多鼠标消息在处理模拟鼠标移动事件之前,该线程不允许线程芬兰语,为我搞乱了。正如我所怀疑的那样,将SendInput调用移动到另一个线程,以便原始线程可以完成修复问题,但现在我需要让消费者更具响应性;鼠标消息继续保持良好的速度我想,因为只有1毫秒的睡眠使得循环太慢并且消息处理开始滞后;如果我没有睡觉,一切都很好。
感谢。
答案 0 :(得分:2)
听起来你想使用win32事件对象而不是互斥锁或关键部分。请参阅文档here。事件函数允许线程在可以从另一个线程发出信号的条件下等待。
答案 1 :(得分:1)
Windows线程支持消息队列 - 通常用于Windows消息,但完全可用于工作线程之间的消息传递。可以在Hook Proc中使用PostThreadMessage将消息发布到另一个线程进行处理。
工作线程可以执行正常的GetMessage
循环来提取要处理的消息 - 而不是像在UI线程中那样将它们传递给DispatchMessage
,只需在消息中检查HWND是否为NULL表示其线程消息的结构,然后自己处理该消息。在潜在消息泛滥的情况下,PeekMessage
可用于剔除队列中的任何未完成消息。