NSFileHandle ведет себя странно, когда работает без отладчика - какая-то проблема NSRunLoop?

Я пишу плагин для Adobe Premiere на Mac, который открывает внешнее приложение, а затем использует NSPipe и NSFileHandle для считывания стандартного вывода из внешнего приложения. Я знаю рекомендуемые способы сделать это, используя либо NSNotificationCenter вместе с командой чтения в фоновом режиме и уведомлении NSFileHandle, либо использовать метод setReadabilityHandler NSFilehandle для чтения выходных данных строки за раз, когда она поступает:

NSTask appTask... // my task which is launching the external app
NSPipe* myPipe = [[NSPipe alloc] init];
[appTask setStandardOutput:[myPipe fileHandleForReading]];
[[myPipe fileHandleForWriting] setReadabilityHandler:^(NSFileHandle *file) {
    NSData* dataRead = [file availableData];
    if (dataRead != nil) {
        printf("Read a line\n");
    }
}];

Это работает хорошо и хорошо, когда я запускаю Premiere из Xcode с подключенным отладчиком. Однако, когда я запускаю Premiere самостоятельно, блок (или уведомление, если я использую этот метод) не вызывается, когда внешнее приложение помещает строку в свой стандартный вывод. Я предполагаю, что есть какой-то странный способ, когда при запуске через Xcode поток, на котором он работает, имеет цикл выполнения, который почему-то неактивен, когда плагин запускается из Premiere, который запускается сам по себе.

Одним из способов решения этой проблемы было бы просто иметь цикл, который проверял несколько раз каждую секунду, есть ли что-то, что нужно прочитать из NSFileHandle канала, работающего в фоновом потоке. Тем не менее, я не могу найти НЕТ ПУТИ, чтобы проверить, есть ли что-то, что можно прочитать из NSFileHandle, не просто блокируя, пока не будет что-то готово (эта блокировка просто остается заблокированной по какой-то причине, даже если есть что-то готовое, когда не запускается через XCode).

Поэтому я надеюсь на одно из двух решений: 1) Какой-нибудь способ исправить все, что не так с NSRunLoop, чтобы блок уведомлений / обратного вызова не срабатывал, когда в NSFileHandle канала есть что-то готовое. или 2) Какой-нибудь способ проверить, есть ли что-то готовое для чтения в NSFileHandle канала без блокирования, пока что-то не будет готово для чтения.

Спасибо за любую помощь!!!!

1 ответ

Решение

Что ж, похоже, что настоящая проблема заключалась в том, что при запуске всего из Xcode мое внешнее приложение немедленно сбрасывало буфер stdout при печати на stdout, но при запуске без Xcode мне нужно было добавить следующую строку, чтобы очистить его вручную:

fflush (стандартный вывод);

Так что проблема была с этим, а не с кодом в моем плагине, который неправильно ожидал и читал из канала!

Другие вопросы по тегам