Qt进程和线程QProcess和QThread的使用

 更新时间:2023年06月05日 10:40:42   作者:Yengi  
本文主要介绍了Qt进程和线程QProcess和QThread的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1、进程

QProcess相当于管理进程的一个类。

.start()相当于fork + exec函数族

(1)头文件

#include <QProcess>

(2)声明和创建

QProcess *np = new QProcess;

(3)启动进程

//直接启动:
np->start("notepad");
//带命令行参数启动:
QString program = "cmd.exe";
QStringList arguments;
arguments << "/c dir&pause";
myProcess.start(program, arguments);

(4)如何获取进程运行时候的一些数据

①信号:readyRead()

②读取数据:readAll();

(5)判断进程的运行状态

//进程状态
enum ProcessState { NotRunning, Starting, Running }
//获取进程状态
state()

(6)关闭进程

//直接关闭
np->close();
//发送杀死信号:
np->kill();

注意:

发送信号的同时,进程不一定结束,一般要用到进程的一些同步函数:

np->waitForFinished();//阻塞到进程结束
np->waitForStarted();//阻塞到进程开始
np->waitForReadyRead();//阻塞到可以从当前进程读取数据
np->waitForBytesWritten();//阻塞到数据写入进程

(7)如果要给一个正在运行的进程发送数据

write()

2、线程

源代码——可执行程序文件——进程(资源分配的基本单位 PCB)——线程(任务调度的基本单位)

pthread_create(pid, attr, func, arg);

QT线程有三种方式:

1.继承QThread,重写run函数

//自定义线程类的头文件
//添加线程类头文件
#include <QThread>
//在类声明里面添加
Q_OBJECT
//重写run函数:线程任务函数
void run();
void MyThread::run()
{
    while(1)
    {
        QThread::sleep(1);
        qDebug()<<"son run";
    }
}
/*----------------------------------------------------------------------------------------*/
//在使用的地方
//添加自定义线程类的头文件
#include "mythread.h"
//创建线程对象
MyThread *mth;
mth = new MyThread;
//开启线程
mth->start();
//关闭线程
mth->terminate();
mth->wait();
//线程间的数据传递
//一般使用信号槽机制来实现

2.直接使用QThread + 自定义QObject派生类的方式

//一个继承于QObject类的一个自定义类
class thread_object : public QObject
//自定义槽函数work()
public slots:
    void work();
void thread_object::work()
{
    while(1)
    {
        qDebug()<<"object thread run";
        QThread::sleep(1);
    }
}
//在主线程中创建一个普通QThread类的对象mth
QThread *mth;
mth = new QThread;
//在主线程中创建一个自定义类thread_object 的对象work
thread_object *work;
work = new thread_object;
//将w的实现移入线程mth的作用范围
work->moveToThread(mth);
//用信号关联w里面想要执行的任务
//在主线程中声明一个信号start_th();
signals:
    void start_th();
//关联这个信号的槽函数为workwork();
connect(this, &MainWindow::start_th, work, &thread_object::work);
//开启线程
mth->start();
emit start_th();

3.用线程池 + 自定义QRunnable派生类的方式

每一个QT程序都存在一个默认的线程池

default_pool = QThreadPool::globalInstance();

1.自定义一个继承于抽象类QRunnable的类(不能添加Q_OBJECT)

class MyTask : public QRunnable
{
public:
    MyTask(QString name);
    void run();
    QString th_name;
};

2.实现run函数

void MyTask::run()
{
    while(1)
    {
        QThread::sleep(1);
        qDebug()<<"任务:【"<<this->th_name<<"】 正在运行...";
    }
}

3.创建一个线程池对象

QThreadPool *pool;
pool = new QThreadPool;

4.添加任务到线程池

//创建自定义的任务
MyTask *t = new MyTask(ui->lineEdit->text());
//将任务添加到线程池
pool->start(t);

5.线程池的相关函数

int activeThreadCount() const : 当前活跃的线程数量
void cancel(QRunnable *runnable):移除掉没有运行的指定任务
void clear():移除掉所有没有运行的任务
int expiryTimeout() const:如果有任务超时未执行,可以通过这个函数自动让其退出
int maxThreadCount() const:线程池可维护的最大的线程个数
void releaseThread():释放保留线程
void reserveThread():保留线程
void setExpiryTimeout(int expiryTimeout):与expiryTimeout()函数一起用,设置超时时间
void setMaxThreadCount(int maxThreadCount):设置线程可管理的最大线程个数
void start(QRunnable *runnable, int priority = 0):添加线程到线程池
bool tryStart(QRunnable *runnable):尝试启动一个指定的线程
bool waitForDone(int msecs = -1):等待退出

到此这篇关于Qt进程和线程QProcess和QThread的使用的文章就介绍到这了,更多相关Qt QProcess QThread内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C/C++ Qt StringListModel 字符串列表映射组件详解

    C/C++ Qt StringListModel 字符串列表映射组件详解

    StringListModel 字符串列表映射组件,该组件用于处理字符串与列表框组件中数据的转换,通常该组件会配合ListView组件一起使用,本文给大家介绍了C/C++ Qt StringListModel 字符串列表映射组件的相关知识,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • C++链表节点的添加和删除介绍

    C++链表节点的添加和删除介绍

    大家好,本篇文章主要讲的是C++链表节点的添加和删除介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • C语言超详细讲解轮转数组

    C语言超详细讲解轮转数组

    这篇文章主要给大家讲解轮转数组的问题,一个问题不局限于一种解法,希望你看了本文的解决方法以后可以举一反三自己编写,这样你的技术水平会有质的提高
    2022-04-04
  • C语言数据结构之 折半查找实例详解

    C语言数据结构之 折半查找实例详解

    这篇文章主要介绍了C语言数据结构之 折半查找实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • C语言实现纸牌计算24点小游戏

    C语言实现纸牌计算24点小游戏

    这篇文章主要为大家详细介绍了C语言实现纸牌计算24点小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • c++中map的基本用法和嵌套用法实例分析

    c++中map的基本用法和嵌套用法实例分析

    这篇文章主要介绍了c++中map的基本用法和嵌套用法,以实例形式分析了map容器的基本使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • C++ 浅谈emplace_back及使用误区

    C++ 浅谈emplace_back及使用误区

    这篇文章主要介绍了C++ 浅谈emplace_back及使用误区,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Qt实现高精度定时器

    Qt实现高精度定时器

    这篇文章主要为大家详细介绍了Qt实现高精度定时器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 一文详解QDialog中exec与open的区别

    一文详解QDialog中exec与open的区别

    这篇文章主要为大家详细介绍了QDialog中exec与open的区别,文中的示例代码讲解详细,对我们学习Qt有一定的帮助,需要的可以参考一下
    2023-03-03
  • 一篇文章彻底弄懂C++虚函数的实现机制

    一篇文章彻底弄懂C++虚函数的实现机制

    C++中的虚函数的作用主要是实现了多态的机制,基类定义虚函数,子类可以重写该函数,在派生类中对基类定义的虚函数进行重写时,需要在派生类中声明该方法为虚方法,这篇文章主要给大家介绍了关于如何通过一篇文章彻底弄懂C++虚函数的实现机制,需要的朋友可以参考下
    2021-06-06

最新评论