« Intermezzo 0.10.5について | ホーム | 自宅サーバ環境の構築にしばし悩む。 »
2009年5月31日
NSStreamの読み込みがコンテクストメニューの表示でふん詰まる件
生きてますよ。(挨拶)
NSInputStreamの取り扱いでずっと気になってたことがあって、ポップアップメニューを表示しているとIRCの接続が切れてしまう現象に遭遇してしまってこれをどう解決しようかちょっと悩んでいた。
まあ、端的に言えばIRCサーバから送られるPINGの受け取り—正確には、TCPレベルではPINGを含むデータストリームが届けられてはいるものの、このデータストリームを取り出して解釈し、PING応答の処理に回す処理が働かないのだな。
http://developer.apple.com/DOCUMENTATION/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW12
Threading Programming Guide: Run Loop Management
直接の要因は、ポップアップメニュー表示中はRun LoopがNSEventTrackingRunLoopModeで回ってしまうこと。通常はNSInputStreamの読み込みはNSDefaultRunLoopModeでしか行われない(というかDefaultモードでの登録しかしない)ので、Run Loopのモードが切り替わってしまうと手も足も出ない。まあ、多くの場合はこれでも問題はないんだけど、IRCの場合はサーバからPINGが来たらなるはやでPONGを返さないとなので、そこでもしポップアップメニューをうっかり出しっぱなしにしてたりなんかすると、下手するとping timeoutで接続切られちゃうんだよな。
当面をしのげればいいやと-[NSInputStream scheduleInRunLoop:forMode:]をNSEventTrackingRunLoopModeで登録してみると、確かにポップアップメニュー表示中もPONGが行えて不都合無く疎通を続けることができる。けど、これじゃ何のためにEventTrackingモードで面倒見るイベントを搾ってるのか意味がなくなってきそう。なのであまり使いたくはない。とするとNSInputStreamの扱いを別スレッドに移してしまうしかないのか。うーん。それをやりたくなかったからNSStreams使ってたのになあ。めんどくさ...。
トラックバック(0)
トラックバックURL: http://foursics.jp/cgi-bin/mt/mt-tb.cgi/257
コメントする