为什么这个应用程序在新线程启动时崩溃,请有人指出我做错了什么。。
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;