QProcess на свободе

#qt #qprocess #destruction

#qt #qprocess #разрушение

Вопрос:

Я создал две программы A и B. B спроектированы как 32-разрядный QProcess, запускаемый в 64-разрядном A. Эти программы прекрасно взаимодействуют через stdin, stdout и QSharedMemory.

 A:A() {
 QProcess *p = new QProcess(this);  
 p->start("B.exe");
}
A:~A() {
 p->deleteLater();
}
  

Теперь, если A закрыт, B также будет закрыт.
Однако, если я в диспетчере задач Windows завершу процесс A, B продолжит работать на свободе, а загрузка процессора B будет зашкаливать. Почему?

Как я могу закрыть B, если A немедленно уничтожен?

Ответ №1:

Попробуйте close() (или kill() ) другой процесс из вашего DTOR и выполните raw delete p после этого. У меня была похожая проблема при использовании объекта QextSerialPort, который тоже имел тенденцию оставаться призраком при удалении с помощью deleteLater(), однако быстро упаковывался и уходил при немедленном удалении.

Комментарии:

1. Я провел некоторую отладку и обнаружил, что когда приложение закрывалось через диспетчер задач Windows или «красную квадратную кнопку» в QtCreator, DTOR для A так и не был достигнут. Вот почему процесс продолжается, и почему ‘close()’ или ‘kill()’ также не работают…