2013-07-01 138 views
0

爲什麼新線程啓動該應用程序崩潰,請somybody指出我有我做enything錯了..應用程序崩潰開始

newthread.h

#ifndef NEWTHREAD_H 
    #define NEWTHREAD_H 
    #include <QThread> 

    class newthread: public QThread 
    { 
     public: 
      newthread(); 

     public slots: 
      void run(); 
    }; 

    #endif // NEWTHREAD_H 

newthread.cpp

#include "newthread.h" 
    #include "mainwindow.h" 
    #include<QDebug> 

    newthread::newthread() 
    { 
    } 

    void newthread::run(){ 
     qDebug()<<"thread executed"; 
    } 

mainwindow.cpp

#include <QtGui> 
     #include "mainwindow.h" 
    #include"newthread.h" 



    MainWindow::MainWindow(QWidget *parent) 
    { 
     setupUi(this); 
     connect(pushButton,SIGNAL(clicked()),this, SLOT(opthread())); 

     } 

    void MainWindow::opthread(){ 
    newthread th; 
    th.start(); 
    } 

這裏在主窗口中有一個名爲ophthread()的公共槽。如上圖所示,當主窗口中的按鈕被按下時,該槽將被觸發。在它中,我宣佈了一個名爲th和th.start()的新線程對象來啓動它。我做錯了什麼嗎?

這個編譯沒有錯誤。但是當運行二進制文件時它會給出錯誤並崩潰。

我的第二個問題是如果我需要線程在主窗口中的文本編輯上寫一些文本如何做到這一點。是否有可能在主窗口類中使用newthread類訪問對象。

+0

您是否嘗試過調試該程序?大多數調試器可以告訴你崩潰發生的地方。 –

+1

'run'應該是'private'(或者在某些情況下是''protected'),絕對不是'public slots'。並且不要繼承QThread!在大多數情況下它是無效的。而且你不能訪問主線程外的GUI元素,你需要使用信號槽信息系統將數據傳送到主線程。 –

+0

deabugger它說,它崩潰的分段錯誤 –

回答

2

當你與創建線程: -

newthread th; 

然後,它會走出去的範圍和被刪除,這是不是你想要的東西。 您需要動態創建對象: -

newthread* th = new newthread; 
+0

這種方法是成功的...非常感謝... –

7
void MainWindow::opthread(){ 
    newthread th; 
    th.start(); 
} 

您正在堆棧上創建線程對象。當功能opthread返回時,他將被銷燬。而從Qt documentation

刪除運行的QThread(即isFinished()返回false)將 可能導致程序崩潰。在刪除QThread之前等待完成的()信號 。

您需要爲您的newthread對象提供更長的使用壽命。等待它完成不是一個選項,因爲它會導致順序執行。您可以使用類成員,也可以在堆上分配線程對象。

個人觀點: 不僅子類化QThread不是最合適的方法來完成它,我相信你根本不需要線程。