2012-01-11 16 views
6

El problema es el siguiente: si la aplicación se cierra mientras no está haciendo nada activamente, se cierra correctamente. Sin embargo, si está trabajando activamente en algo (esperando en un ciclo while, por ejemplo), la ventana principal se cerrará pero el programa continuará ejecutándose en segundo plano, como se confirma al abrir el administrador de tareas.La aplicación Qt permanece en la memoria incluso después de que MainWindow está cerrada

He pasado una buena parte del día buscando en Google el problema y la implementación de posibles soluciones, pero fue en vano. Parece que la función quit() simplemente no hace nada. Aquí hay algunas cosas que he intentado:

  • Usando app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));. Sé que la señal se disparó, porque traté de cambiar &app, SLOT(quit()) a qApp, SLOT(aboutQt()) y la ventana aboutQt apareció brevemente.
  • Incluyendo qApp->quit(); al principio de una función que se ejecuta desde el botón de una ventana principal. La aplicación se ejecuta en esa línea, pero no tiene ningún efecto.
  • Usando processEvents() para asegurarse de que la GUI se está actualizando.
  • Incluyendo declaraciones como mainWindow.setAttribute(Qt::WA_QuitOnClose); en main.cpp.

Solo quiero que la aplicación salga por completo cuando se cierre la ventana principal.

Estoy usando la biblioteca qextserialport, si eso hace alguna diferencia.

+0

¿Su aplicación es multihilo? – Lol4t0

+0

No estoy creando subprocesos personalmente, pero no estoy seguro de si la biblioteca que estoy usando es. Si abro el depurador y miro debajo de los hilos, veré un montón de funciones "ntdll! LdrFindResourceEx_U". Sin embargo, solo veo una instancia de mi programa en los procesos del administrador de tareas. PD: ¿Por qué demonios presionar ingresar enviaría el mensaje en lugar de crear un salto de línea? – SharpHawk

+0

Entonces su hilo principal puede esperar esos hilos para terminar su trabajo. Se puede hacer implícitamente, por ejemplo, los destructores de objetos pueden esperar a que termine el hilo. Debes estudiar tu código de biblioteca. PS 'qextserialport', hasta donde yo sé, no crea ningún hilo. – Lol4t0

Respuesta

1

No sé lo que está mal, pero como su ranura realmente recibe la señal, puede llamar al exit() desde esa función de ranura como una solución.

+0

Creo que es una mala solución, porque si la aplicación procesa algo en otro hilo, después de dicha terminación, TS puede corromper algunos datos – Lol4t0

Cuestiones relacionadas