【发布时间】:2011-07-20 19:43:26
【问题描述】:
我正在编写一个使用 Win32 API 处理击键事件的库。每次击键发生时,两个独立的事件几乎同时发生(this 和this)。在我的库中,我有两个单独的线程,一个用于每种事件(hook 和 raw)。
线程 1(钩子)等待线程 2(原始)在继续之前获取其数据。它目前使用类似屏障的机制来实现这一点。因此,这两个事件都必须在其中任何一个事件被实际处理之前进入。到目前为止一切顺利。
但是有一个问题(当然)。在一个理想的世界里,我可以保证一直得到这两个事件。不幸的是,由于我不明白的原因,有时 Windows 决定不向我提供这两个事件中的一个(通常另一个应用程序暂时与输入有关)。因此,如果我输入“Hello world”,线程 1 可能正在处理“H”,而线程 2 可能从未收到“H”事件,并跳到“e”。所以事件失去了同步,一切都乱了套。
基本上我想要的是:我想以一种有意义的方式配对事件。如果线程 1 得到一个“H”事件,而线程 2 得到一个“e”,它应该 (1) 尝试等待正确的“H”事件,或者 (2) 超时(是的,线程 1 可以正常失败如果必须)。由于我知道事件都应该在某个时间窗口内出现,我想这使它成为一项实时编程任务。
我对实时编程一无所知。是否已经有解决方案/数据结构?如果是这样,它们是什么?如果不是,那么解决此类问题的一般方法是什么(保持两个暂时关闭的事件同步)?
谢谢。
【问题讨论】:
-
你为什么要等两个?
-
一个 API 让我可以控制击键的位置,另一个让我确定它来自哪个键盘。我希望能够同时做这两件事(根据哪个键盘发送输入来控制输入的位置)。正是这种匹配事件现在令人头疼。
-
在任何情况下,WM_KEYUP/WM_KEYDOWN 消息肯定只会进入具有输入焦点的窗口...?
-
不,我做的事情比这低得多。我正在使用原始输入 API 和全局钩子——它与焦点窗口毫无关系。顺便我得到的事件是
WM_INPUT。 -
对于那些病态好奇的人,you can check out the project。
标签: windows multithreading winapi real-time