2015-10-14 4 views
1

У меня есть приложение Qt, которое запускает другое приложение. Я хочу получить сигнал, если дочернее приложение будет завершено извне.Окончание процесса обработки Qt

Код:

CaptureApp::CaptureApp(int& argc, char** argv): QApplication(argc, argv) 
{  
    launchDaemon(); 
} 

void CaptureApp::launchDaemon() 
{ 
    QString command = "daemon"; 
    QStringList arguments; 
    arguments << "somearg"; 
    process = new QProcess(this); 
    process->start(command, arguments); 
    connect(process,SIGNAL(stateChanged(QProcess::ProcessState)),this,SLOT(daemonDied(QProcess::ProcessState))); 
    connect(process,SIGNAL(finished(int)),this,SLOT(daemonDied(int))); 
} 
void CaptureApp::daemonDied(QProcess::ProcessState state) 
{ 
    std::cout << "DAEMON DIED" << std::endl; 
} 

void CaptureApp::daemonDied(int code) 
{ 
    std::cout << "DAEMON DIED" << std::endl; 
} 

Но сообщение не появляется, когда я убить дочерний процесс. Что я делаю не так?

+0

Что такое 'spaceNavProcess'? Почему бы вам не подключить «процесс»? Я также сомневаюсь, что убийство процесса вызовет любой сигнал. – vahancho

+0

@vahancho Извините, это была ошибка при копировании кода здесь. Первоначально имена одобрены – Lecko

+0

Является ли демон, который вы запускаете настоящего, хорошо написанного демона? Если это так, он будет отсоединен от своего родителя. Вы можете проверить, что с помощью 'pstree' или' ps aux', чтобы увидеть, стал ли этот демон дочерним элементом PID 1 ('init' или' systemd' или что-то еще). Замечание: вот почему Qt как 'QProcess :: startDetached()' специально для запуска демонов (или имитировать хорошо написанный демон, который в любом случае будет отсоединен от его родителя). – jbm

ответ

1

Я попробовал ваш пример inherriting из QApplication, но в первую очередь он дал мне эту ошибку:

QObject::connect: No such slot QApplication::daemonDied(QProcess::ProcessState) 
QObject::connect: No such slot QApplication::daemonDied(int) 

Затем я добавил Q_OBJECT к определению класса и соединили сигналы/слоты, но когда я убил процесс он дал следующую ошибку:

ICE default IO error handler doing an exit(), pid = 27773, errno = 4 

Когда я однако изменил класс наследовать от QObject вместо QApplication он сделал работу. Так что с основным:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    CaptureApp captureApp(argc,argv); 

    return a.exec(); 
} 

Как прокомментировал jbm, некоторые процессы остаются прикрепленными, а другие - нет. Я попробовал сначала gedit, и он получил сигнал сразу после начала указания процессов. Однако, используя vim, он продолжал работать, и я смог убить его извне.

Смежные вопросы