2014-10-03 174 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),否则应用程序应在最后一个窗口关闭时退出。可能你在你的窗口代码中的某处阻塞了事件循环。