Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

signals sent by qtcreator on "stop"

I am working on linux and I realized that my application was leaving behind daemon processes when I close it with the "Stop" button on Qt creator IDE. I want to handle these cases so the application close the same way as when I close the main window. To write the handlers, I need to know which signals it corresponds to.

like image 219
UmNyobe Avatar asked Jan 03 '13 11:01

UmNyobe


People also ask

How do you block signals in Qt?

QSignalBlocker can be used wherever you would otherwise use a pair of calls to blockSignals(). It blocks signals in its constructor and in the destructor it resets the state to what it was before the constructor ran.

What is unclaimed breakpoint in Qt?

An unclaimed breakpoint represents a task to interrupt the debugged program and passes the control to you later. It has two states: pending and implanted . Unclaimed breakpoints are stored as a part of a session and exist independently of whether a program is being debugged or not.


2 Answers

Digging into QtCreator's code, I can see that QtCreator uses a QProcess internally to launch your app. The red "stop" button is connected to ApplicationLauncher::stop(), which terminates your process in one of two ways depending if it's a GUI app or a console app, but in both cases, the result end up to be the same on Linux.

For a GUI app, ApplicationLauncher calls QProcess::terminate(), which in turn sends a SIGTERM (on Linux) signal to your daemon. It then waits (with waitForFinished()) for 1 second, and if the daemon hasn't quit by then, it calls QProcess::kill(), sending SIGKILL.

For a console app, ApplicationLauncher delegates the termination to the ConsoleProcess utility class. On Linux, ConsoleProcess::stop() will act similar to ApplicationLauncher for a GUI app, which is first sending SIGTERM, then waiting for 1 second, and sending SIGKILL if it hasn't terminated yet.

You will find the relevant code from QtCreator here:

  • GUI app termination
  • Console app termination (on Linux)
  • Console app termination (on Windows)
like image 125
Fred Avatar answered Sep 27 '22 01:09

Fred


Short version: You can't

Long version:

You could try using:

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

But this won't work as expected. If a process is terminated by force (which is what the stop in the IDE is doing, I'd guess using TerminateProcess() on windows http://msdn.microsoft.com/en-gb/library/windows/desktop/ms686714(v=vs.85).aspx ) then the process is instantly killed in the middle of whatever it is executing. Its not possible to handle these cases from Qt alone.

like image 29
paulm Avatar answered Sep 24 '22 01:09

paulm