Qt多线程实现思路二
2024-09-05 03:21:10
- 建立一个继承于Qobject的类myThread
- 在类myThread中定义线程处理函数不必是思路一里的run();
- 在窗口类中开辟一个自定义线程myThread的指针对象myT = new myThread;
- thread = new QThread(this); //创建QThread类子线程
- myT->moveToThread(thread); 把自定义线程加入到子线程中
- 自定义线程中的线程任务就可以按照线程执行
- 这样建立的线程只能通过信号和槽的方式来调用
- 一般将任务写在while()里面,在线程退出时,会等待线程任务结束再退出
- 线程处理函数内部,不允许操作图形界面
mythread.h文件
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread> class myThread : public QObject
{
Q_OBJECT
public:
explicit myThread(QObject *parent = );
//线程处理函数
void myTimeout(); void setFlag(bool flag = true); 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 )
{ QThread::sleep();
emit mySignal(); qDebug() << "子线程号:" << QThread::currentThread(); if(isStop)
{
break;
}
}
} void myThread::setFlag(bool flag)
{
isStop = flag;
}
- widget.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include "mythread.h"
#include <QWidget>
#include <QTimer>
#include <QThread>
#include <QDebug>
namespace Ui {
class Widget;
} class Widget : public QWidget
{
Q_OBJECT public:
explicit Widget(QWidget *parent = );
~Widget();
void dealSignal();
void dealClose(); signals:
void startThread(); //启动子线程的信号 private slots: void on_start_clicked(); void on_stop_clicked(); private:
Ui::Widget *ui;
myThread *myT;
QThread *thread;
}; #endif // WIDGET_H
- widget.cpp文件
#include "widget.h"
#include "ui_widget.h"
#include "mythread.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
myT = new myThread;//不能初始化指定父类myThread(this) //创建子线程
thread = new QThread(this); //把自定义线程加入到子线程中
myT->moveToThread(thread); connect(myT, &myThread::mySignal, this, &Widget::dealSignal); qDebug() << "主线程号:" << QThread::currentThread(); connect(this, &Widget::startThread, myT, &myThread::myTimeout); //窗口关闭时调用线程关闭,前提是线程要运行完当前任务
connect(this, &Widget::destroyed, this, &Widget::dealClose); } Widget::~Widget()
{
delete ui;
} void Widget::dealClose()
{
on_stop_clicked();
delete myT;
} void Widget::dealSignal()
{
static int i = ;
i++;
ui->lcdNumber->display(i);
} void Widget::on_start_clicked()
{
if(thread->isRunning() == true)
{
return;
} //启动线程,但是没有启动线程处理函数
thread->start();
myT->setFlag(false); //不能直接调用线程处理函数,
//直接调用,导致,线程处理函数和主线程是在同一个线程
//只能通过 signal - slot 方式调用
emit startThread();
} void Widget::on_stop_clicked()
{
if(thread->isRunning() == false)
{
return;
} myT->setFlag(true);
thread->quit();
thread->wait();
}
最新文章
- JDBC API Description
- c# 远程连接ORACLE数据库
- 【python】用setup安装自定义模块和包
- Oracle11g在使用exp导出时不导出空表问题的解决办法
- PAIP.MYSQL SLEEP 连接太多解决
- 针对局域网IM飞秋(feiq)的开发总结
- nyoj 129 树的判定
- 三个PHP常用代码样例
- C++中弱符号(弱引用)的意义及实例
- java 空指针异常造成的原因有哪些
- Java基础----jdk1.8 反射实验
- ●BOZJ 2127 happiness
- oldboy s21day13装饰器和推导式
- 18.22 sprintf函数功能
- 2018-2019-2 20165205 《网络对抗技术》 Exp6 信息收集与漏洞扫描
- python常用库之random
- Gym 101972
- lua脚本之lua语言简介以及lua的安装
- 安卓程序代写 网上程序代写[原]Android开发技巧--Application
- centos6.4安装GCC