Qt中多线程写法一(步骤讲解+代码+加演示)
1.线程简单介绍进程 运行中的程序!没运行的不算main函数开始运行到main函数结束操作系统上资源调度的基本单位!线程 函数 并发执行操作系统上程序调度的基本单位!同一进程内的线程 共享 进程的所有资源!2.qt多进程怎么写2.1. 创建类(继承QObject)2.2 改为继承自QThread2.3 重写QThread类中的run函数2.4 信号与槽方式启动QThread对象的start函数2.
文章共2,622字 · 阅读需要大约9分钟
一键AI生成摘要,助你高效阅读
问答
·
1.线程简单介绍
进程 运行中的程序!没运行的不算
main函数开始运行 到 main函数结束
操作系统上资源调度的基本单位!
线程 函数 并发执行
操作系统上程序调度的基本单位!
同一进程内的线程 共享 进程的所有资源!
2.qt多进程怎么写
2.1. 创建类(继承QObject)
2.2 改为继承自QThread
2.3 重写QThread类中的run函数
2.4 信号与槽方式启动QThread对象的start函数
2.5 关联信号与槽,操作
2.6 线程结束
注意点:
- 线程结束 先 quit 再wait
- 也可以使用terminate()来结束
上面这两个存在一定的区别,可以看看文档,这里随机数开始,暂停我直接用的第二种,第一种先quit(),再wait()不行
3.以例子来说明:
做两个行文本,一个行文本实时显示当前系统时间
另外一个行文本显示随机数
做两个按钮 (开始 暂停)
点击暂停,随机数停止滚动
点击开始,随机数又开始滚动
4.效果演示
5.代码
randThread.h
#ifndef RANDTHREAD_H
#define RANDTHREAD_H
//1.继承QOject
#include <QObject>
#include<QThread>
//2.改为public QThread
class randThread : public QThread
{
Q_OBJECT
public:
explicit randThread(QObject *parent = nullptr);
signals:
//自定义信号
void randSignal();
//3.重写run函数
protected:
void run();//线程入口函数
};
#endif // RANDTHREAD_H
randThread.cpp
#include "randThread.h"
randThread::randThread(QObject *parent) : QThread(parent)
{
}
void randThread::run()
{
while(1)
{
emit randSignal();
QThread::usleep(1000);
}
}
timeThrea.h:
#ifndef TIMETHREAD_H
#define TIMETHREAD_H
#include <QObject>
#include<QThread>
class timeThread : public QThread
{
Q_OBJECT
public:
explicit timeThread(QObject *parent = nullptr);
signals:
void timeSignal();//自定义信号
protected:
void run() ; //线程入口函数
};
#endif // TIMETHREAD_H
timeThread.cpp
#include "timeThread.h"
timeThread::timeThread(QObject *parent) : QThread(parent)
{
}
void timeThread::run()
{
while(1)
{
emit timeSignal();
QThread::sleep(1);
}
}
MyWidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include<QTime>
#include<QDateTime>
#include"randThread.h"
#include"timeThread.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = nullptr);
~MyWidget();
public slots:
void timeSlot();
void randSlot();
//线程结束函数
void quitThreadSlot();
private slots:
void on_pushButton_open_clicked();
void on_pushButton_close_clicked();
private:
Ui::MyWidget *ui;
//...线程对象....
randThread*pRandThread;
timeThread*pTimeThread;
};
#endif // MYWIDGET_H
MyWidget.cpp
#include "MyWidgett.h"
#include "ui_MyWidget.h"
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MyWidget)
{
ui->setupUi(this);
setWindowTitle("qt的多线程");
//....创建线程对象.......
pRandThread=new randThread(this);
pTimeThread=new timeThread(this);
//...调用run函数...每隔1s发送一个信号...
pRandThread->start();
pTimeThread->start();
ui->pushButton_open->setEnabled(false);
connect(pTimeThread,SIGNAL(timeSignal()),this,SLOT(timeSlot()));
connect(pRandThread,SIGNAL(randSignal()),this,SLOT(randSlot()));
//关闭窗口的时候结束线程
connect(this,SIGNAL(destroyed()),this,SLOT(quitThreadSlot()));
}
MyWidget::~MyWidget()
{
delete ui;
}
void MyWidget::timeSlot()
{
//.1.获取当前的时间
QDateTime currentTime=QDateTime::currentDateTime();
QString str_time=currentTime.toString("yyyy.MM.dd ddd hh:mm:ss");
ui->lineEdit_time->setText(str_time);
}
void MyWidget::randSlot()
{
// 1.获取一个随机数
QString str_rand=QString("%1").arg(qrand()%30);
// 2.显示到文本
ui->lineEdit_rand->setText(str_rand);
}
void MyWidget::quitThreadSlot()
{
pTimeThread->quit();
pTimeThread->wait();
pRandThread->quit();
pRandThread->wait();
}
//...开始.....
void MyWidget::on_pushButton_open_clicked()
{
ui->pushButton_open->setEnabled(false);
ui->pushButton_close->setEnabled(true);
pRandThread->start();
}
//...暂停随机数......
void MyWidget::on_pushButton_close_clicked()
{
ui->pushButton_close->setEnabled(false);
ui->pushButton_open->setEnabled(true);
pRandThread->terminate();
}
更多推荐
已为社区贡献1条内容
所有评论(0)