0

我正在编写一个单线程 Cocoa 应用程序并尝试使用NSNotificationCenter实用程序方法(因为这似乎是可可中的工作方式)来执行非阻塞 IO。

除了文件句柄关闭时,一切似乎都正常。它最终会通知我,但它需要很长时间。谁能解释为什么会这样?

更具体地说,我正在编写一个分叉进程并读取其标准输出的屏幕保护程序。行为也会根据上下文发生变化。当它在“系统偏好设置”的预览窗口中运行时,它会更快地通知关闭,然后在单击测试按钮时全屏运行。

编辑:经过一番思考,我相信问题在于最后一次写入和关闭几乎同时发生。最后一次读取发生在NSFileHandle关闭之后,它返回数据(即不在 EOF 处)。我通过等待它完成,但由于文件句柄处于非活动状态,主循环将保持阻塞,因为没有任何信号通知它执行。预览模式起作用的原因是,每当我单击“系统偏好设置”窗口中的某些内容时,我都会强制执行主循环,它会检查NSFileHandle正在等待的状态并看到它已关闭。

现在我想我知道发生了什么,但我仍然不知道如何弄清楚它是在NSFileHandle没有阻塞的情况下关闭的!

经过更多测试后,此问题似乎是屏幕保护程序执行时独有的。

4

1 回答 1

-1

......不要在你的游行中下雨,但自 10.3 (IIRC) 以来,随着NSStream课程的引入,I/O 已经被大大重写,这些课程通常是 The Way To Go。(当然NSFileHandle仍然运作良好,但它不是最新最酷的。)

另外,关闭后阅读?嗯?

于 2010-01-18T13:42:08.927 回答