为什么这个应用程序在新线程启动时崩溃,请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类访问对象。
答案 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;