2012-08-06 73 views
0

我使用CGEventPost()以编程方式发布键盘和鼠标事件。这些事件最终会触发其他事件/动作(例如,某些窗口变为活动状态,按下按钮,在文本字段中输入字母)。为了同步线程,我想知道何时由特定CGEvent触发的所有事件都已完成处理。如何判断CGEvent触发的操作何时结束?

所有CGEventPost() s将最终在单个应用程序的单个窗口上执行。

编辑:

Nielsbot的解决方案工作得很好。最后,我简要介绍了MCL的CCL事件分派功能。该功能会阻塞,直到Cocoa运行过程循环中的所有当前事件都已完成执行。由于所有键盘和鼠标事件最终都会触发在该线程上运行的操作,因此此方法工作得很好。

我唯一担心的是,事件调度在CGEvent触发事件循环中的某个操作之前被调用'before',但是我的测试目前正在显示这没有发生。所以我现在正在使用这个解决方案。

只是FYSA,它似乎需要一个保守的1ms发布的事件来击中运行循环,至少在我的设置。

(defun event-dispatch() 
    (with-shadow (gui::queue-for-event-process 
       (lambda (f &key at-start) 
        (declare (ignore at-start)) 
        (funcall fun-orig f :at-start nil))) 
    (gui::call-in-event-process (lambda()())))) 

回答

1

如何将自定义事件类型队列作为标记插入?等到该事件触发你自己的一些代码 - 这可能会提供足够好的指示,表明您发布的所有以前的事件都已经处理完毕...

+0

是的;这并不坏;只要该自定义事件触发nsrunloop做某件事,那么我至少知道nsrunloop线程已经处理了第一个事件。也就是说,只要自定义事件没有在主事件之前进入nsrunloop。 – 2012-08-06 21:31:49

+0

您可能还会看看'CFRunLoopObserver',尽管在事件循环运行之后,在**之前找不到**的触发器类型,并且根据文档触发器可能不会始终触发。 – nielsbot 2012-08-06 23:14:22

+0

感谢您的建议!我随你的第一个想法去了。 – 2012-08-07 18:54:35

相关问题