2009-12-28 5 views
2

NSTask에서 메시지를 받기 위해 NSNotificationCenter에서 NSFileHandleReadCompletionNotification 메시지를 읽습니다. 문제는 내가 호출하는 커맨드 라인 프로그램이 출력 라인에 상대적으로 느리고 NSFileHandleReadCompletionNotification 메시지가 비교적 드물게 게시된다는 것입니다 (버퍼가 가득 찼을 때).NSFileHandleReadCompletionNotification에 더 작은 버퍼를 사용할 수 있습니까?

알림이나 모든 행을 게시하는 데 사용할 수있는 다른 알림 메시지가 있습니까? 아니면 버퍼를 더 작게 만들 수있는 방법이 있습니까?

편집 : 분명히 말하면, 버퍼 크기는 "기본 운영 체제의 버퍼 크기에 맞게"NSFileHandle documentation에 있으므로, 다른 트릭이 있기를 바랍니다.

답변

1

당신이

- (void)readInBackgroundAndNotify 

방법으로 NSFileHandle 읽기 (오른쪽?), 그리고 NSFileHandleReadCompletionNotification 핸들러에서 데이터를 구문 분석하는 경우는 - 그래서, 버퍼 크기는 제한되지 않는다 - 읽을 수 모든 "availableData" 알림을 받기 전에 백그라운드에서 readInBackgroundAndNotify을 다시 호출하여 다음 부분을 가져옵니다.

그러나 잘 알려진 I/O 버퍼링 기술로 인해 문제가 발생한다고 생각합니다.

작업 명령 측면에서 버퍼링을 해제해야합니다. 당신이 펄 스크립트를 호출하는 경우 예, 단지

$|=1; 

또는

use IO::Handle; 
STDOUT->autoflush(1); 
STDERR->autoflush(1); 

스크립트의 상단 부근에 라인을 넣어.

C 프로그램의 경우 setvbuf 함수를 사용하여 버퍼 크기를 0으로 설정합니다.

+1

NSFileHandle은 C stdio 스트림을 래핑하지 않습니다. 파일 설명자를 래핑합니다. 'setvbuf'는 아무 효과가 없습니다. 파일 핸들이 내부적으로 스트림에 의해 백업 된 경우에도 해당 스트림에 대한 액세스 권한이 없으므로 스트림을 직접 만들고 버퍼 모드를 설정해도 파일 핸들의 스트림에 영향을 미치지 않습니다. –

+0

저는 꽤 확신합니다. 피터 말이 맞아. 귀하의 제안을 (파이썬 작업에 -u 플래그를 추가하여) 시도했지만 아무 것도 변경되지 않았습니다. 지금까지 시도한 유일한 방법은 파이썬 스크립트의 출력에 공백을 추가하는 것입니다.이 스크립트는 끔찍한 해커처럼 보입니다. – oldpatricka

관련 문제