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):等待退出
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用QtQProcess类杀掉一个QThread进程,你可以使用QProcess的start方法来启动一个进程,然后使用taskkill命令来杀掉指定的进程。在引用中的代码示例中,killExe函数展示了如何使用QProcess来杀掉一个指定的进程。在该函数中,通过执行命令"taskkill -im exeName -f"来杀掉进程。其中,exeName是要被杀掉的进程名。注意,这段代码是适用于Windows操作系统的。如果你使用的是Linux系统,你可以参考引用中的start函数的代码,然后自行编写适用于Linux系统的进程杀死代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【Qt专栏】Qt嵌入进程和杀死进程](https://blog.csdn.net/weixin_43729127/article/details/126908645)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Qt进程线QProcessQThread](https://blog.csdn.net/qq_45698138/article/details/126273572)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yengi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值