0

私はシングル スレッドの Cocoa アプリを作成しており、NSNotificationCenter非ブロッキング IO を実行するためにユーティリティ方法論 (ココアでの処理方法のようです) を使用しようとしています。

ファイル ハンドルが閉じている場合を除いて、すべて正常に動作しているようです。最終的には通知されますが、永遠にかかります。これがなぜなのか、誰か説明できますか?

より具体的には、プロセスをフォークしてその標準出力を読み取るスクリーン セーバーを作成しています。コンテキストに基づいて動作も変化します。システム環境設定のプレビュー ウィンドウで実行しているときは、テスト ボタンをクリックしたときにフル スクリーンで実行するときよりも、閉じるときに通知が速くなります。

編集:少し考えた後、問題は最後の書き込みとクローズがほぼ同時に発生することだと思います。が閉じられた後に最後の読み取りがNSFileHandle行われ、データが返されます (つまり、EOF ではない)。私はそれを待って終了しますが、ファイルハンドルが非アクティブであるため、実行するように通知するものがないため、メインループはブロックされたままになります。プレビュー モードが機能する理由は、[システム環境設定] ウィンドウで何かをクリックするたびに、メイン ループを強制的に実行し、NSFileHandle待機中の状態をチェックして閉じていることを確認するためです。

これで何が起こっているのかがわかったと思いますが、NSFileHandleブロックせずに が閉じていることを理解する方法はまだわかりません!

さらにテストを行った結果、この問題はスクリーン セーバーの実行中にのみ発生するようです。

4

1 に答える 1

-1

NSStream…あなたのパレードに雨を降らせてはいけませんが、I/O は 10.3 (IIRC) 以降、通常は The Way To Go であるクラスの導入により大幅に書き直されました。(もちろんNSFileHandle、それでもうまく動作しますが、最新で最もクールなわけではありません。)

また、閉店後の読書は?は?

于 2010-01-18T13:42:08.927 に答える