2014-10-03 108 views
0

所有進程這是我的main.cpp這將啓動主窗口:C++應用程序不殺退出

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    TabWindow w; 
    w.show(); 
    return a.exec(); 
} 

即使有a.connect(...)我不明白爲什麼myApplication.exe仍然運行後,我關閉主窗口。 關於如何在點擊退出按鈕後完全結束所有進程的任何建議?

編輯:的這樣說: 我們建議您清理代碼連接,而不是把它在你的應用程序的main()函數將aboutToQuit()信號。這是因爲,在某些平臺上,QApplication :: exec()調用可能不會返回。

+0

你有沒有線程可以啓動? – 2014-10-03 16:00:29

+0

@ratchetfreak是的,我願意。現在您提到了,我正在使用'QtConcurrent'來啓動一個工作線程,並且在工作線程完成之前關閉應用程序時發生此錯誤。 – BurninatorDor 2014-10-03 16:04:54

+0

@ratchetfreak有沒有辦法在退出應用程序之前刪除所有線程? – BurninatorDor 2014-10-03 16:17:26

回答

1

感謝@ratchetfreak在我的問題中發表的評論,我找出問題所在。

在我的MainWindow中,我啓動了工作線程,該工作線程沒有終止,因此在應用程序關閉後仍然保持爲一個進程。爲了解決這個問題,我註冊了關閉事件並跟蹤了線程的存在 - 即基本上忽略了closeEvent,直到線程被刪除。

void MainWindow::closeEvent(QCloseEvent *event) 
{ 
    if (workerThreadExists) { 
     // Gracefully exiting all tasks inside the worker thread 
     while (workerThreadExists){ 
      event->ignore(); 
     } 
     event->accept(); 

    } 
} 

...對我來說workerThreadExists只是一旦創建線程,然後當線程被刪除它設置爲false時設置爲true的BOOLEAN。希望這可以幫助!

-4

只是

return 0; 

這應該結束其與該程序相關的所有進程取代

return a.exec(); 

+2

'a.exec()'運行Qt事件循環,沒有它的應用程序將基本上不可用。 – 2014-10-03 15:10:22

0

你應該有這樣的事情:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    TabWindow w; 
    w.show(); 
    return a.exec(); 
} 

// Do quit in your TabWindow: 
TabWindow::TabWindow() 
    : public QWidget(NULL) 
{ 
    connect(ui->myQuitButton, SIGNAL(clicked()), qApp, SLOT(quit())); 
} 
+0

我明白你的觀點。但是,我能做些什麼來真正殺死退出時的所有進程? – BurninatorDor 2014-10-03 15:12:37

+1

沒有任何死循環,因爲'aboutToQuit'信號只能發射一次。多次調用QApplication :: quit()不會導致多個'aboutToQuit'信號。 – 2014-10-03 15:20:58

+1

1更多... – 2014-10-03 15:21:52

2

沒有什麼錯與您的代碼。而你的連接並沒有做任何事情。

除非您在某處撥打QGuiApplication::setQuitOnLastWindowClosed(true),否則應用程序應在最後一個窗口關閉時退出。可能你在你的窗口代碼中的某處阻塞了事件循環。