所以我已经被这个问题困扰了一段时间。出于某种原因,我的应用程序总是在关闭时崩溃,这是我收到的错误消息:
由于触发了异常,下级停止了操作。
线程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();
你当然可以把它放在析构函数上。