2014-11-05 73 views
1

所以我一直在这个问题上停留了一段时间。出于某种原因,我的应用程序始终崩溃关闭,这是我得到的错误消息:Qt5应用程序在关闭时崩溃(QWidget :: show)

劣势停止,因为它引发了异常。异常在0x50c15a08,代码:

在线程0通过停止0000005:读访问冲突于:为0x0,标志=为0x0(第一次机会)

堆栈显示以下内容:

QWidget的::秀行:7030

而这正是我的main.cpp目前的样子:

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

我不知道为什么崩溃正在发生。

稍微背景:这是一个多线程应用程序(同时使用QThread和QtConcurrent)。当线程未启动时,应用程序关闭就好了。因此,我增加了以下检查,以确保该线程被正确终止,但这并没有帮助:

void MainWindow::closeEvent(QCloseEvent *event) 
    { 
      if (thread->isRunning()) { 
       thread->terminate(); 
       while(!thread->isFinished()){ 
       } 
       event->accept(); 
      } 
    } 

编辑:如何在新线程创建

QThread *myThread = new QThread(this); 
     Worker *worker = new Worker(this, user, p); 
     worker->moveToThread(myThread); 

     connect(myThread, SIGNAL(started()), worker, SLOT(doWork())); 
     connect(worker, SIGNAL(workDone()), this, SLOT(deleteThread())); 
     myThread->start(); 

...和这是我在下载完成后如何处理删除线程:

void MainWindow::deleteThread(){ 
    worker->deleteLater(); 
    myThread->quit(); 
    while(!myThread->isFinished()){ 
    } 
    myThread->deleteLater(); 
} 
+0

你是否用有效的父母创建线程,以便Qt能够正确地处理它们? – Bowdzone 2014-11-05 06:58:44

+0

这里'thread'的类型是什么?它是否继承'QThread'? – Nejat 2014-11-05 07:04:34

+0

要一起回答@Bowdzone和@ Nejat的问题,是的线程确实有有效的父亲,并且它是从QThread继承的。 'QThread线程=新QThread(this)'这里'这是'MainWindow'类 – BurninatorDor 2014-11-05 14:21:27

回答

1

您应该听取n用于来自线程的终止信号或等待线程终止。告诉线程终止不会阻塞,所以如果您立即接受关闭事件,您将得到您的异常。

此进行更详细的文档中为terminate slot

+0

如果您检查问题中发布的最后一段代码,我不会在我致电终止后立即调用'event-> accept'。程序循环直到'myThread.isFinished'返回true。 – BurninatorDor 2014-11-06 14:54:29

+1

@burninatorDor:完成,未运行和终止都是不同的。如果线程没有终止,你会得到一个异常。 [这里的第一篇文章很好的描述了QThread生命周期](http://stackoverflow.com/questions/17045368/qthread-emits-finished-signal-but-isrunning-returns-true-and-isfinished-re)并且通常关于这个话题的一个很好的讨论 – Klathzazt 2014-11-06 17:07:13

1

正确的QThread停止代码描述是:

myThread->quit(); 
myThread->wait(); 

此外您已经使用moveToThread(本);

您需要先将moveToThread移回父线程。

例如你的代码是:

moveToThread(this); 
start(); 

您需要保存moveToThread前currentThread()()这样的:

QThread *savedThread=currentThread(); 

moveToThread(this); 
start(); 

而之前退出或终止您需要将其还原:

moveToThread(savedThread); 

quit(); 
wait(); 

你当然可以把它放在析构函数上。

+0

我很抱歉,但这并没有帮助 – BurninatorDor 2014-11-06 20:29:18

+0

@BurninatorDor如果您评论此行,会发生什么? while(!myThread-> isFinished()){}如果您可以发送给我项目,我会修复它。 – IGHOR 2014-11-06 23:05:45