NSTask> NSTextView, но вывод, пока задача еще не завершена - PullRequest
0 голосов
/ 17 апреля 2011

Я работаю над созданием очень простой IDE для C / C ++ со всем шебангом XCode-Interface Builder-Cocoa-Objective-C. Окно документа разделено с помощью NSSplitView на текстовый редактор и другой подкласс NSTextView, который я хочу использовать как терминал для запуска скомпилированной программы. Я могу успешно перенести свой стандартный вывод в этот NSTextView с помощью задачи. pipe-filehandle system, но проблема в том, что это, очевидно, должно происходить построчно для программ, которые требуют ввода в scanf () или что-то еще, и сейчас это текстовое представление будет обновляться только после завершения программы. Я еще не настроил стандартный ввод, откуда бы он ни пришел, поэтому в данный момент я печатаю в консоли отладчика, но, например, если моя программа похожа на

int input;  
printf("Enter some input: ");  
scanf("%d", &input);  
printf("\nSome more output blah blah blah.\n");

тогда я ничего не получу, пока не введу свой ввод в консоль, после чего текстовое представление получит все содержимое дескриптора файла, которое будет оба оператора printf один за другим. Не очень полезно на всех. Итак, как мне обновить текстовое представление в режиме реального времени? Или есть какой-то чудесно простой способ заставить представление вести себя так же, как терминальная консоль? Не рассчитывая на это. Для справки, вот мой маленький фрагмент кода после того, как я настроил задачу, канал и дескриптор файла. outview - это объект IBOutlet, представляющий рассматриваемое текстовое представление вывода. Спасибо!

[programTask launch];

NSData *data;
data = [programFileHandle availableData];

NSString *fileout;
fileout = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];

NSRange endRange;
endRange.location = [[outview textStorage] length];
endRange.length = 0;
[outview replaceCharactersInRange:endRange withString:fileout];
...