事件处理程序循环与Stream运行循环相交

时间:2010-07-01 18:29:02

标签: cocoa events stream

我正在尝试在Cocoa中创建一个插入鼠标移动事件的套接字服务器。

这个帖子:Mouse tracking daemon

有关于鼠标事件处理程序的信息,这非常有用,但是,我需要通过套接字传输这些事件。

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

因为指南很有帮助,但是关于将流的运行循环与事件处理程序循环相交,我有一个断开连接。

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

感谢您的任何意见!

克里斯

1 个答案:

答案 0 :(得分:1)

  

我真正想要的是当我得到鼠标移动事件时,将它从插座中吐出来。

从您链接到的文档:

  

流处理的潜在问题是阻塞。写入...流的线程可能必须无限期地等待,直到流上有...空间来放置字节...。

如果您只是进行阻止写入,则可以永久阻止,挂起您的应用程序。

如果您只是进行非阻塞写入,则可能只会编写您想要的部分内容。如果你不记得你剩下的东西并试着稍后再发送它,这会让另一方感到困惑。

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

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

在鼠标移动的处理程序中,如果您之前收到过has-space-available事件并且没有要发送的鼠标移动事件,请发送您刚刚获得的事件。否则,请记住该事件以供日后使用。 (一次只保留一个事件 - 如果你得到另一个事件,扔掉旧事件。)

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

无论哪种方式,当您尝试写入字节并仅写入其中一些字节时,请记住字节和中断位置。您应该只在完全发送前一个事件后才开始发送一个新的鼠标移动事件。

请注意,我所描述的解决方案删除事件,如果您获得的事件比发送事件的速度快。这不是一个问题:如果你得到它们比发送它们更快,并且你保持它们直到你可以发送它们,那么它们将堆积并翻倒(你的内存和你的应用程序用完了)崩溃/你的应用程序停止工作/你陷入系统)或用户将看到“追赶”的实例,接收端的鼠标慢慢重播所有事件,因为他们慢慢进来。我说它更好,在你的放弃你无法发送的事件,让接收鼠标在空间内传送以弥补丢失的时间。