Закрытые вызовы будут длиться вечно, используя асинхронный ввод-вывод Какао? - PullRequest
0 голосов
/ 17 января 2010

Я пишу однопоточное приложение Какао и пытаюсь использовать методологию утилиты NSNotificationCenter (так как кажется, как это делается в какао) для выполнения неблокирующего ввода-вывода.

Кажется, все работает нормально , за исключением , когда дескриптор файла закрыт. Это в конечном счете уведомляет меня, но это берет навсегда. Кто-нибудь может объяснить, почему это будет?

Точнее говоря, я пишу заставку, которая разветвляет процесс и считывает его стандартный вывод. Поведение также меняется в зависимости от контекста. Когда он запускается в окне предварительного просмотра в Системных настройках, он уведомляет о закрытии быстрее, чем при запуске в полноэкранном режиме при нажатии кнопки тестирования.

Edit: После небольшой мысли, я считаю, что проблема в том, что последняя запись и закрытие происходят примерно в одно и то же время. Последнее чтение происходит после закрытия NSFileHandle и возвращает данные (т.е. не в EOF). Я заканчиваю, ожидая его, но так как дескриптор файла неактивен, основной цикл останется заблокированным, так как нечего сигнализировать о его выполнении. Причина, по которой работает режим предварительного просмотра, заключается в том, что всякий раз, когда я щелкаю по чему-либо в окне «Системные настройки», я заставляю основной цикл выполняться, и он проверяет состояние ожидающего NSFileHandle и видит, что он закрыт.

Теперь я думаю, что знаю, что происходит, но я все еще не знаю, как выяснить, что NSFileHandle закрыт без блокировки!

После еще нескольких испытаний эта проблема, по-видимому, не относится к моменту запуска Заставки.

1 Ответ

0 голосов
/ 18 января 2010

... не для того, чтобы идти дождь на вашем параде, но ввод / вывод был значительно переписан с 10.3 (IIRC) с введением классов NSStream, которые обычно являются Way To Go. (Конечно, NSFileHandle все еще работает хорошо, но это не последний и самый крутой.)

Кроме того, чтение после закрытия? А?

...