2010-01-17 62 views
0

我正在編寫單線程Cocoa應用程序,並試圖使用NSNotificationCenter實用程序方法(因爲這似乎是在可可中完成的事情)來執行非阻塞IO。關閉調用永遠使用可可的異步IO?

一切似乎做工精細除了當文件句柄被關閉。它最終通知我,但它需要永遠。任何人都可以解釋爲什麼這會是?

更具體地說,我正在編寫一個屏幕保護程序,它可以分叉進程並讀取它的stdout。行爲也基於上下文而改變。當它在系統偏好設置的預覽窗口中運行時,它會以更快的速度進行通知,然後在單擊測試按鈕時全屏運行。

編輯:花點心思後,我相信問題是,上次寫和關閉發生在大約相同的時間。最後一次讀取在NSFileHandle已關閉後發生,並且它返回數據(即不在EOF處)。我完成了等待,但由於文件句柄處於非活動狀態,主循環將保持阻塞狀態,因爲沒有任何信號可以執行。預覽模式工作的原因是因爲每當我點擊「系統首選項」窗口中的某些內容時,我強制執行主循環,並檢查正在等待的NSFileHandle的狀態並看到它已關閉。

現在我想我知道發生了什麼,但我仍然不知道如何找出不遮住了NSFileHandle關閉!

經過一些更多的測試之後,這個問題似乎是屏幕保護程序執行時的專有問題。

回答

-1

...不要在你的遊行上下雨,但自10.3(IIRC)開始,NSStream課程通常會改寫I/O,這通常是The Way To Go。 (當然NSFileHandle依然很不錯,但它不是最新的,最酷的。)

而且,收盤後看什麼?咦?

+0

close close後會讀取(假設我已經讀取了所有的緩衝數據)返回0字節,意思是EOF。我使用'NSTask'來分支產生三個'NSFileHandle'的進程。我不認爲'NSSTream'是我想要的,因爲它似乎專門用於網絡套接字。 – jdizzle 2010-01-18 14:20:02

+0

你是什麼意思「幾乎同時發生」?你的意思是來自不同的線程?還有什麼讓你覺得「關閉後讀取將返回0字節」?該文件明確指出,它會引發例外。 – 2010-01-25 14:37:01

+0

上次寫入和關閉都來自子進程。關閉後讀取至少返回0個字節。這就是你知道你在EOF的方式。如果你指的是NSFileHandle文檔,它表示如果從文件句柄讀取錯誤,它會拋出一個異常。 EOF不是錯誤。 – jdizzle 2010-02-09 13:31:08