新线程启动时应用程序崩溃



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

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";
    } 

主窗口.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();
     }

在主窗口中有一个名为ophread()的公共插槽。如上所示,当按下主窗口中的按钮时,该插槽将触发。在它中,我声明了一个名为th和th.start()的新线程对象来启动它。我做错了什么吗。

这本书没有错。但当运行二进制文件时,它会出现错误并崩溃。

我的第二个问题是,如果我需要线程在主窗口的textEdit上写一些文本,如何做到这一点。newthread类是否可能访问主窗口类中的对象。

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

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

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

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

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

创建线程时使用:-

newthread th;

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

newthread* th = new newthread;

最新更新