新线程上的应用程序崩溃开始

时间:2013-07-01 08:32:50

标签: c++ multithreading qt

为什么这个应用程序在新线程启动时崩溃,请somybody指出我做错了什么..

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的thth和th.start()的新线程对象来启动它。我做错了什么。

这个编译没有错误。但是当运行二进制文件时,它会出错并崩溃。

我的第二个问题是,如果我需要线程在主窗口的textEdit上写一些文本怎么做。是否可以在mainwindow类中使用newthread类访问对象。

2 个答案:

答案 0 :(得分:7)

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

您正在堆栈上创建线程对象。当函数opthread返回时,他将被销毁。并从Qt documentation

  

删除正在运行的QThread(即isFinished()返回false)将会   可能导致程序崩溃。等待finished()信号   在删除QThread之前。

您需要为newthread对象提供更长的生命周期。等待它完成不是一个选项,因为它将导致顺序执行。要么使用类成员,要么在堆上分配线程对象。

个人意见: 不仅对QThread进行子类化并不是最合适的方法,我相信你根本不需要一个线程。

答案 1 :(得分:2)

当你用以下方法创建线程时: -

newthread th;

然后它将超出范围并被删除,这不是你想要的。 您需要动态创建对象: -

newthread* th = new newthread;