2010-07-01 119 views
1

我正在尝试使可可中发出鼠标移动事件的套接字服务器。事件处理程序循环相交流运行循环

这个线程:Mouse tracking daemon

有关于鼠标事件处理程序,这是真正有用的,但是,我需要通过插座输出流这些事件的信息。

使用http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Streams/Articles/PollingVersusRunloop.html#//apple_ref/doc/uid/20002275-CJBEDDBG

如为指导是有帮助的,但我有一个脱节对于交叉与事件处理循环流的运行循环。

我真正想要的是当我得到一个鼠标移动事件,吐出插座。我甚至需要流的运行循环?如果没有,我该怎么做?

感谢您的任何意见!

克里斯

回答

1

我真正想要的是当我得到一个鼠标移动事件,吐出来的插座。

从文档链接到您:

与流处理的一个潜在问题是阻塞。正在写入...的流的线程可能需要无限期地等待,直到流中有空间来放置字节...。

如果你只是做了一个阻塞写入,你可以永远封锁你的应用程序。

如果你只是做了一个非阻塞写,你可能只写部分你的意图。如果您不记得剩下的内容,并尝试稍后再发送,则会使对方感到困惑。

进入运行循环。鼠标移动事件也会出现在运行循环中 - 您不需要或不需要单独的运行循环。 “相交”这两个事件源正是运行循环的目的。

你会希望你的事件处理程序之间的对称性:每个应该发送一些字节或记住一些状态(使用后者的几个实例变量)。

在鼠标移动的处理程序中,如果您以前收到一个有空间可用的事件并且没有要发送的鼠标移动事件,请发送刚获得的事件。否则,请稍后记住该事件。 (一次只保留一个事件 - 如果你得到另一个事件,则丢弃较旧的事件)

在has-space-available处理程序中,如果您有未发送的鼠标移动事件,请发送它现在。否则,请记住您有可用的空间,所以您可以在您的下一个鼠标移动事件中使用它。

无论哪种方式,当您尝试写入字节并只写入其中一些字符时,请记住字节和您从哪里离开。您只应在完成发送之前发送新的鼠标移动事件。

请注意,正如我所描述的解决方案拖放事件,如果你收到事件比你可以发送更快。这不是一个问题:如果你获得的速度比发送速度快,而且你可以将它们放在一边,直到你将它们发送出去,然后它们会堆积并翻倒(内存和应用程序耗尽崩溃/你的应用停止工作/你陷入停滞状态),或者用户会看到“catch-up”的实例,接收端的鼠标缓慢地重放所有事件,当它们慢慢进入时。我说它更好,在你的的情况下,放弃你无法发送的事件,并让接收鼠标通过太空传送来弥补失去的时间。

+0

嗨,彼得, 感谢您的答复。抱歉,延迟回复,我刚刚在收件箱中注意到了这一点。 我最终忽略了运行循环,只是直接写入套接字,因为我得到鼠标事件。我有一个匿名函数附加到事件处理程序,它发送鼠标的deltaX和deltaY的简单字符串。 它似乎没有滞后或性能下降。不过,我一定会仔细调查你的解决方案,为自己的启迪。 谢谢! Chris – Raconteur 2010-07-14 21:42:26