2010-07-01 107 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