0

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

新线程.h

   #ifndef NEWTHREAD_H
    #define NEWTHREAD_H
   #include <QThread>

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

        public slots:
            void run();
     };

     #endif // NEWTHREAD_H

新线程.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();
     }

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

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

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

4

2 回答 2

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

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

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

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

个人观点:不仅子类化QThread不是最合适的方法,相信你根本不需要线程。

于 2013-07-01T08:40:28.677 回答
2

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

newthread th;

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

newthread* th = new newthread;
于 2013-07-01T08:41:17.847 回答