簡體   English   中英

Qt5應用在關閉時崩潰(QWidget :: show)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM