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"
risposta
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:
risposta chiara Fred. – UmNyobe
@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
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.
Questo sarebbe SIGTERM credo. – sashoalm