[英]Qt5 App crashes on close (QWidget::show)
因此,我已經在這個問題上停留了一段時間。 由於某些原因,我的應用程序總是在關閉時崩潰,這是我收到的錯誤消息:
下級停止,因為它觸發了異常。
通過以下方式在線程0中停止:在0x50c15a08處發生異常,代碼:0xc0000005:在0x0處發生讀取訪問沖突,標志= 0x0(第一次機會)
堆棧顯示以下內容:
QWidget :: show Line: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();
}
您應該偵聽來自線程的終止信號,或者等待線程終止。 告訴線程終止不會阻塞,因此,如果您隨后立即接受close事件,則會得到異常。
有關終止插槽的文檔中有更詳細的描述
正確的QThread停止代碼為:
myThread->quit();
myThread->wait();
您還使用過moveToThread(this);
您需要先將ToToThread返回到父線程。
例如,您的代碼是:
moveToThread(this);
start();
您需要像這樣在moveToThread()之前保存currentThread():
QThread *savedThread=currentThread();
moveToThread(this);
start();
在退出或終止之前,您需要恢復它:
moveToThread(savedThread);
quit();
wait();
您當然可以將其放在析構函數上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.