Qt5应用程序关闭时崩溃(QWidget::show)



所以我已经被这个问题困扰了一段时间。出于某种原因,我的应用程序总是在关闭时崩溃,这是我收到的错误消息:

由于触发了异常,下级停止了操作。

线程0中停止者:0x50c15a08处的异常,代码:0xc0000005:0x0处的读取访问冲突,标志=0x0(第一次机会)

堆栈显示以下内容:

QWidget::show线路: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();
}

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

这在终止槽的文档中有更详细的描述

正确的QThread停止代码是:

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

此外,您还使用了moveToThread(this);

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

例如,您的代码是:

moveToThread(this);
start();

在移动到线程()之前,您需要保存currentThread(),如下所示:

QThread *savedThread=currentThread();
moveToThread(this);
start();

在退出或终止之前,您需要恢复它:

moveToThread(savedThread);
quit();
wait();

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

相关内容

  • 没有找到相关文章

最新更新