多线程"/>
Qt 多线程
通过不继承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
//myThread.cpp
#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_OBJECTpublic: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
更多推荐
Qt 多线程
发布评论