2014-03-07 1 views
2

콘솔 응용 프로그램의 구성자 역할을하는 대화 상자가 있습니다. 이 대화 상자의 임무는 사용자에게 위젯 세트 (콘솔 응용 프로그램에서 지원하는 옵션을 미러링)를 제공하는 것입니다. 사용자가 "시작"버튼을 클릭하면 콘솔 응용 프로그램의 이름과 매개 변수로 QProcess가 만들어지고 시작됩니다. GUI에서 위젯의 상태. 프로세스를 성공적으로 시작할 수 있고 모든 것이 잘 작동합니다. 그러나 프로세스를 종료하려면 콘솔 응용 프로그램을 정상적으로 종료해야합니다. 즉, 파일을 닫고 데이터를 플러시하고 장치를 닫은 다음 종료해야합니다.Windows에서 QProcess를 사용하여 시작한 프로세스에 Ctrl + C 이벤트 보내기

QProcess :: close()를 사용하면 응용 프로그램이 즉시 종료되고 응용 프로그램을 정상적으로 종료 할 수 없습니다.

나는 Win32 GenerateConsoleCtrlEvent(CTRL_C_EVENT, Q_PID::dwProcessId)을 사용하여 동일한 것을 보냈다. 위의 API는 0이 아닌 값 (성공을 나타냄, 실패시 0을 반환 함)을 반환하지만 프로세스는 계속 실행됩니다.

정상적인 종료를 위해 QProcess 신호를 보내는 방법을 알려 준 사람이 누구입니까? 아니면 다른 방법이 있습니까?

+0

문제의 응용 프로그램이 실제로 Ctrl-C를 정상적으로 처리하고 있습니까? 소스 코드가 있습니까? –

+0

예. 내 코드는 Ctrl + C 및 Ctrl + Break 이벤트를 처리합니다. – Bharath

답변

1

GenerateConsoleCtrlEvent은 프로세스 id가 아닌 프로세스 그룹입니다. 그게 프로세스 ID인데, 왜냐하면 그것은 QProcess이 제공하는 것일 수 있습니다.

QProcess은 현재 프로세스 그룹 생성을 지원하지 않습니다. winapi를 사용하여 프로세스를 수동으로 시작하거나 qtbase/src/corelib/io/qprocess[.h,.cpp,_win.cpp]을 수정하여 Qt의 복사본을 패치하여 CREATE_NEW_PROCESS_GROUP 생성 플래그를 전달해야합니다.

Qt 자체를 조정하고 싶지 않다면 qprocess 파일을 프로젝트에 복사하고 클래스 이름을 바꾸고 거기에 변경 사항을 추가 할 수 있습니다.

관련 문제