Winapi 如何创建阻塞函数

Winapi 如何创建阻塞函数,winapi,blocking,Winapi,Blocking,我有一个线程需要在消息生成后立即发送消息(它使用SendInput发送的模拟鼠标事件)。我希望这一切发生在一个没有睡眠的循环中;添加任何睡眠都会影响性能,因为我基本上希望事件在生成后立即进入事件循环。当然,我也不希望消费者线程中的循环占用所有cpu,所以我不能让它一直运行,尽管这给了我很好的性能 据我所知,任务是让消费线程等待一些信号,表明生产线程已经提供了要分派的内容(?),但是如何最好地做到这一点呢?如果我想让两个线程互斥,我想我需要两个互斥体;消费者等待生产者,消费者恢复运行后生产者继续?

我有一个线程需要在消息生成后立即发送消息(它使用SendInput发送的模拟鼠标事件)。我希望这一切发生在一个没有睡眠的循环中;添加任何睡眠都会影响性能,因为我基本上希望事件在生成后立即进入事件循环。当然,我也不希望消费者线程中的循环占用所有cpu,所以我不能让它一直运行,尽管这给了我很好的性能

据我所知,任务是让消费线程等待一些信号,表明生产线程已经提供了要分派的内容(?),但是如何最好地做到这一点呢?如果我想让两个线程互斥,我想我需要两个互斥体;消费者等待生产者,消费者恢复运行后生产者继续?到目前为止,我还没有真正做到这一点,我真的不知道如何最好地做到这一点;CriticalSections和互斥锁,完全不同

我不想从producer线程调用SendInput的原因是,该线程(“主线程”)实际上是响应鼠标移动消息运行的,被鼠标钩子截获,并且从该线程发送更多鼠标消息不允许线程在处理模拟鼠标移动事件之前使用芬兰语,给我搞砸了。正如我所怀疑的,将SendInput调用移动到另一个线程,以便原始线程可以完成,解决了问题,但现在我需要让消费者更具响应性;我想,鼠标消息一直以很好的速度出现,因为仅仅1毫秒的睡眠时间就使得循环速度太慢,消息处理开始滞后;如果我不睡觉,一切都很好


谢谢。

听起来您想使用win32事件对象,而不是互斥体或关键部分。见文件。事件函数允许线程在可以从另一个线程发出信号的条件下等待。

听起来您想使用win32事件对象,而不是互斥体或关键部分。见文件。事件函数允许线程在可以从另一个线程发出信号的情况下等待。

Windows线程支持消息队列-通常用于Windows消息,但完全可用于工作线程之间的消息传递。可以在Hook进程中使用,将消息发布到另一个线程进行处理


工作线程可以执行一个普通的
GetMessage
循环来提取要处理的消息,而不是像在UI线程中那样将它们传递到
DispatchMessage
,只需在消息结构中检查HWND是否为NULL,指示其为线程消息,然后自己处理消息。在潜在的消息泛滥的情况下,
peek消息
可用于从队列中剔除任何未处理的消息。

Windows线程支持消息队列-通常用于Windows消息,但完全可用于工作线程之间的消息传递。可以在Hook进程中使用,将消息发布到另一个线程进行处理


工作线程可以执行一个普通的
GetMessage
循环来提取要处理的消息,而不是像在UI线程中那样将它们传递到
DispatchMessage
,只需在消息结构中检查HWND是否为NULL,指示其为线程消息,然后自己处理消息。在潜在的消息泛滥情况下,
peek消息
可用于从队列中剔除任何未处理的消息。

谢谢。我将研究它以供将来参考,尽管这一次看来睡眠终究会对我有用;只有一些cout打印输出在发送鼠标输入时才被执行,从而降低了执行速度:sThanks。我将研究它以供将来参考,尽管这一次看来睡眠终究会对我有用;当鼠标输入被调度时,一些cout打印输出最终被执行,从而降低了执行速度:sOk,这很好。然而,在我的例子中,我需要使用SendInput(我需要操作系统在屏幕上移动光标),这样工作人员就不能对从UI线程获得的“消息”进行所有处理。当光标需要重新定位时,它应该1)获取坐标,2)调用SendInput,3)等待UI线程的下一个坐标。最好是,我想确保UI线程在调用SendInput之前甚至没有完成对原始鼠标移动消息的处理。这是一个模拟光标,实际光标每次移动时都应该放回原位;以前,当出现鼠标移动消息且光标需要在屏幕上重新定位时,我使用UI线程调用SendInput。现在我不禁要问自己,为什么这没有导致僵局;这两条消息都得到了处理(递归)。从UI线程调用SendInput不正是应该保证停止的事情吗?好的,很高兴知道。然而,在我的例子中,我需要使用SendInput(我需要操作系统在屏幕上移动光标),这样工作人员就不能对从UI线程获得的“消息”进行所有处理。当光标需要重新定位时,它应该1)获取坐标,2)调用SendInput,3)等待UI线程的下一个坐标。最好是,我想确保UI线程在调用SendInput之前甚至没有完成对原始鼠标移动消息的处理。这是一个模拟光标,实际光标每次移动时都应该放回原位;以前,当出现鼠标移动消息且光标需要在屏幕上重新定位时,我使用UI线程调用SendInput。现在我不禁要问自己,为什么这没有导致僵局;这两条消息都得到了处理(递归)。从UI线程调用SendInput不正是应该保证的吗