#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()’ также не работают…