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_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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值