【问题标题】:Event handler loop intersecting Stream run-loop事件处理程序循环与 Stream 运行循环相交
【发布时间】:2010-07-03 00:03:46
【问题描述】:

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

本帖:Mouse tracking daemon

有关于鼠标事件处理程序的信息,这真的很有帮助,但是,我需要通过套接字将这些事件流式传输出去。

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

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

我真正想要的是当我得到一个鼠标移动事件时,把它吐出套接字。我什至需要流的运行循环吗?如果没有,我该怎么做??

感谢您的任何意见!

克里斯

【问题讨论】:

    标签: cocoa events stream


    【解决方案1】:

    我真正想要的是当我得到一个鼠标移动事件时,把它吐出套接字。

    来自您链接到的文档:

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

    如果您只是进行了阻塞写入,您可能会永远阻塞,从而挂起您的应用程序。

    如果您只是进行了非阻塞式写入,您可能只会写入您想要的部分内容。如果您不记得您还剩下什么并尝试稍后再次发送,这会使对方感到困惑。

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

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

    在鼠标移动处理程序中,如果您之前收到了一个可用空间事件并且没有要发送的鼠标移动事件,请发送您刚刚收到的事件。否则,请记住该事件以备后用。 (一次只保留一个事件——如果你有另一个事件,就把旧的扔掉。)

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

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

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

    【讨论】:

    • 嗨彼得,感谢您的回复。抱歉回复延迟,我刚刚在我的收件箱中注意到了这一点。我最终忽略了运行循环,并在收到鼠标事件时直接写入套接字。我有一个附加到事件处理程序的匿名函数,它发送鼠标的 deltaX 和 deltaY 的简单字符串。它似乎没有滞后或性能下降。但是,我一定会仔细研究您的解决方案,以启发我自己。谢谢!克里斯
    猜你喜欢
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 2023-03-06
    • 2011-09-09
    相关资源
    最近更新 更多