通过不继承QThread的方式
1>创建自定义类 myT = new MyThread();
2>定义子线程 thread = new QThread(this);
3>将最定义类加入到子线程 mythread->moveToThread(thread);
4>启动子线程 thread->start(); 此时只启动子线程,但是并没有启动子线程的程序。
5>启动线程程序 启动子线程后,先想自定义线程发送信号,绑定自定义类的处理函数。
6>停止线程 thread->quit();thread->wait();
7>线程内部函数不允许操作图形界面,否则程序会崩溃,用来处理数据。
8>释放内存 delete 没有指定父对象的指针如myT
注: connect第五个参数的作用
多线程时候的链接方式,默认的时候如果是多线程,默认使用队列。
单线程时候默认使用直接方式。
队列:槽函数所在线程和信号接受者一样。
直接:槽函数所在线程和发送者在同一个 线程
默认就好了。。。。。
代码:
myThread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QObject>
#include <QThread>
class MyThread : public QObject
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = 0);
void myTimeout();
void setFlag(bool );
signals:
void mySignal();
public slots:``
private:
bool isStop;
};
#endif // MYTHREAD_H
#include "mythread.h"
#include <QThread>
#include <QDebug>
MyThread::MyThread(QObject *parent) : QObject(parent)
{
isStop = false;
}
void MyThread::myTimeout(){
while (isStop == false) {
qDebug()<<"子线程号: "<<QThread::currentThreadId();
QThread::sleep(1);
emit mySignal();
if(isStop == true){
break;
}
}
}
void MyThread::setFlag(bool flag){
isStop = flag;
}
``
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include "mythread.h"
#include <QWidget>
#include <QThread>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
void dealSignal();
~Widget();
signals:
void startThread(); //启动子线程程序的信号
private slots:
void on_btn_start_clicked();
void on_btn_stop_clicked();
private:
Ui::Widget *ui;
MyThread *mythread;
QThread *thread;
};
#endif // WIDGET_H
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
mythread = new MyThread();
thread = new QThread(this);
mythread->moveToThread(thread);
qDebug()<<"主线程号:"<<QThread::currentThreadId();
connect(this, &Widget::startThread, mythread, &MyThread::myTimeout);
connect(mythread, &MyThread::mySignal, this, &Widget::dealSignal);
}
Widget::~Widget()
{
on_btn_stop_clicked();
delete ui;
}
void Widget::on_btn_start_clicked()
{
//启动线程,但是没有启动线程处理函数
if(thread ->isRunning() == false){
mythread->setFlag(false);
thread->start();
emit startThread();
}
}
void Widget::dealSignal(){
static int i = 0;
ui->lcdNumber->display(i++);
}
void Widget::on_btn_stop_clicked()
{
if(thread->isRunning() == true){
mythread->setFlag(true);
thread->quit();
thread->wait();
}
}
//控件分别是:btn_start btn_stop lcd