2014-05-20 3 views
1

두 개의 GUI 응용 프로그램이 있고 그 중 하나는 QProcess를 사용하여 다른 응용 프로그램을 실행합니다. 두 번째 응용 프로그램은 작업을 수행하고 결과 문자열을 표준 출력에 씁니다. 첫 번째 응용 프로그램은 readyReadStandardOutput 신호가 QProcess에서 방출 될 때까지 기다리고 있습니다. 문제는 두 번째 응용 프로그램이 실행되는 동안이 신호를받지 못한다는 것입니다. 결과 문자열을 얻기 위해 닫아야합니다. 나는 간단한 콘솔 어플리케이션으로 같은 것을 시도했지만 모든 것이 잘되었다. 누구든지 도와 줄 수 있습니까?Q 프로세스 읽기 표준 출력

+0

두 번째 응용 프로그램을 W32 또는 콘솔 응용 프로그램으로 실행하고 있습니까? 내 experince cin/cout 잘 아닌 콘솔 응용 프로그램에 잘 대처하지 않습니다. [이 질문] (http://stackoverflow.com/questions/191842/how-do-i-get-console-output-in-c-with-a-windows-program) 당신에게 관심이있을 수 있습니다. – MatthiasB

+0

예, 저는 win32 응용 프로그램을 실행하고 있습니다. 그러나 @hyde가 말했듯이 문제는 단지 stdout 버퍼링에 불과했습니다. –

답변

1

문제는 아마도 표준 출력 버퍼링입니다. 당신은 분명히 콘솔 응용 프로그램을 수정할 수 있기 때문에 아마 명시 적 세척을 선호하는 거라고하지만, 당신은 또한 모두 함께 또는 힘 라인 버퍼링을 버퍼링하지 않으려면 콘솔 응용 프로그램에 std::setvbuf를 사용하여 시도 할 수 있습니다

std::cout << "FUBAR" << std::flush; 

처럼 std::flush, 무언가를 추가하려고 완성 된 부분을 가지고 있으면 즉시 한 번에 플러시 할 수 있습니다.

+0

정말 고마워요! –

+1

@MikhailZimka 왜 이런 일이 발생하는지 궁금하다면, * stdout *은 실제 터미널/콘솔 (tty/pty가 있고 더 구체적 임)에서 실행 중인지 아니면 출력이 있는지에 따라 다르게 버퍼링되기 때문입니다 파이프에가. 터미널을 사용하면 사람이 실시간으로 출력물을보고있을 것이고 실시간 버퍼링은 실시간과 처리량간에 적절한 절충안입니다. 파이프를 사용하면 출력은 다른 프로세스로 이동하게됩니다. 보통 프로세스가 플러시 될 때주의를 기울이지 않으므로 버퍼가 꽉 찼을 때만 플러시되고 프로그램에서 "실시간"출력이 예상되는 경우에는 작동하지 않습니다. – hyde

+0

다시 한 번 자세한 설명을 해 주셔서 감사합니다. –