Qt 多线程

编程入门 行业动态 更新时间:2024-10-09 03:24:31

Qt <a href=https://www.elefans.com/category/jswz/34/1767532.html style=多线程"/>

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 多线程

本文发布于:2024-02-19 16:09:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1765185.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:多线程   Qt

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!