2013-01-03 10 views
5

Sto lavorando su linux e mi sono reso conto che la mia applicazione stava abbandonando i processi demone quando la chiudo con il pulsante "Stop" su ID utente creatore Qt. Voglio gestire questi casi in modo che l'applicazione si chiuda allo stesso modo di quando chiudo la finestra principale. Per scrivere i gestori, ho bisogno di sapere a quali segnali corrisponde.segnali inviati da qtcreator su "stop"

+0

Questo sarebbe SIGTERM credo. – sashoalm

risposta

7

Scavando nel codice di QtCreator, posso vedere che QtCreator utilizza internamente un processo QProcess per avviare l'app. Il pulsante rosso "stop" è collegato a ApplicationLauncher::stop(), che termina il processo in due modi, a seconda che si tratti di un'app GUI o di un'app console, ma in entrambi i casi, il risultato sarà lo stesso su Linux.

Per un'applicazione GUI, ApplicationLauncher chiamate QProcess::terminate(), che a sua volta invia un segnale SIGTERM (su Linux) al demone. Quindi attende (con waitForFinished()) per 1 secondo e se il daemon non ha chiuso, chiama QProcess::kill(), inviando SIGKILL.

Per un'app console, ApplicationLauncher, la terminazione alla classe di utilità ConsoleProcess. Su Linux, ConsoleProcess::stop() si comporterà come ApplicationLauncher per un'app GUI, che prima invia SIGTERM, quindi attende 1 secondo e invia SIGKILL se non è ancora terminato.

se si trova il relativo codice da QtCreator qui:

+0

risposta chiara Fred. – UmNyobe

+1

@Fred Quindi i collegamenti di codice rilevanti si applicano a "Esecuzione" di un'applicazione - tuttavia, naturalmente, questi blocchi sono irrilevanti quando si esegue il debug di un'applicazione. Qualche idea su dove eseguire le operazioni stop/kill corrispondenti per il debug? Forse semplicemente ordina a gdb di eseguire in qualche modo questa azione di timeout dell'uccisione? – dtmland

0

Versione corta: Non è possibile

Versione lunga:

Si potrebbe provare a utilizzare:

http://doc.qt.digia.com/qt/qcoreapplication.html#aboutToQuit

Ma questo non funzionerà come previsto. Se un processo viene terminato con la forza (che è ciò che sta facendo l'arresto nell'IDE, suppongo che utilizzi TerminateProcess() su Windows http://msdn.microsoft.com/en-gb/library/windows/desktop/ms686714(v=vs.85).aspx), il processo viene immediatamente ucciso nel mezzo di qualunque cosa stia eseguendo. Non è possibile gestire questi casi da Qt da solo.