【QT常用技术讲解】多线程编程处理卡顿
创始人
2024-11-04 10:08:57
0

前言

        本文在上一篇【QT常用技术讲解】tableWidget右键菜单及多进程编程的基础上,加入多线程,解决调用进程执行后台命令导致QT程序卡顿的现象。

概述

        QT应用本身是一个进程,当通过QProcess创建一个进程来执行其他任务时,QT应用是被阻塞的,必须等待QProcess创建的进程执行完,才能继续往下执行,这是典型的进程阻塞模式。而使用多线程,则是“并行执行”的效果,此时QT应用就不会有卡顿现象,多线程是QT项目处理卡顿现象最常用的方法。

功能讲解

        增加通用的执行后台命令的线程类,下面为threadCmd.h的源码:

#ifndef THREADCMD_H #define THREADCMD_H  #include  #include  #include  #include  #include  #include "src/util/comm_define.h"  class ThreadCmd : public QThread {     Q_OBJECT public:     explicit ThreadCmd(const QString ¶m,QObject *parent = nullptr) ;  protected:     void run() override; signals:     void callback(const QString result);  private:     QString m_param; };  #endif // THREADCMD_H 

以下为threadCmd.cpp的源码:

#ifndef THREADCMD_CPP #define THREADCMD_CPP  #include "threadCmd.h" #include  #include  #include "src/util/comm_define.h" #include   ThreadCmd::ThreadCmd(const QString ¶m,QObject *parent) : QThread(parent),m_param(param) {  }  void ThreadCmd::run(){     QProcess process;     // 执行命令     QString cmd = m_param;     qDebug() << __LINE__ << cmd;     process.start(cmd);     if(process.waitForFinished()){         // 读取进程的输出         QString output = QString::fromLocal8Bit(process.readAllStandardOutput());         QTextCodec *codec = QTextCodec::codecForName("GBK");         QString unicodeOutput = codec->toUnicode(output.toLocal8Bit());         emit callback(unicodeOutput);     }else{         emit callback("[error]:命令执行失败");     }     // 进程使用完毕后,可以手动删除     process.deleteLater(); }   #endif // THREADCMD_CPP 

ping对话框涉及的改动点,pingdialog.h调整代码如下

private slots:      void ThreadsendResult(const QString &result);//执行后台命令的槽函数     void ThreadkillProc(const QString &result);//执行kill进程的槽函数

pingdialog.cpp调整代码如下

void pingDialog::on_start_clicked() {     ui->textBrowser->setReadOnly(false);//     ui->textBrowser->setText("--------ping start--------");     QString times = ui->timeBox->currentText();     QString Ipstr=ui->ipEdit->text();     QString cmd = QString("ping -n %1 %2").arg(times).arg(Ipstr);      m_isStart=true;     //把调用QProcess执行后台命令的代码改成调用多线程类     ThreadCmd *thread = new ThreadCmd(cmd, this);     //等待多线程的callback信号,关联ThreadsendResult槽函数来处理结果     connect(thread, &ThreadCmd::callback, this, &pingDialog::ThreadsendResult);     thread->start();  }   void pingDialog::on_stop_clicked() {     if(m_isStart==true){         ui->textBrowser->setReadOnly(false);//         ui->textBrowser->setText("--------ping stop--------");         //QString cmd = QString("pkill ping");//linux执行的         QString cmd = QString("taskkill /IM ping.exe /F");          ThreadCmd *thread = new ThreadCmd(cmd, this);         connect(thread, &ThreadCmd::callback, this, &pingDialog::ThreadkillProc);         thread->start();     } }  void pingDialog::ThreadsendResult(const QString &result) {     qDebug() << "ThreadsendResult finished with result:" << result;     ui->textBrowser->append(result);     ThreadCmd *thread = qobject_cast(sender());     if (thread) {         thread->deleteLater(); // 删除线程对象     }     m_isStart=false; }  void pingDialog::ThreadkillProc(const QString &result) {     qDebug() << "ThreadkillProc finished with result:" << result;     ThreadCmd *thread = qobject_cast(sender());     if (thread) {         thread->deleteLater(); // 删除线程对象     } }

注意事项

        并非所有的事务都要开线程来处理,QT本身已经有很好的机制来处理前端互动的效果了。开了线程一定有损耗(创建、回收等),必定会影响性能,做为C/C++开发者,写代码必须得考虑性能的因素。

        而阻塞模式对性能的影响很大,远远超出线程的消耗,常见的阻塞方式有:

1、通过进程打开“第三方”应用;

2、网络编程的等待及响应;

相关内容

热门资讯

现就发布提示!贵阳辅助工具,欢... 现就发布提示!贵阳辅助工具,欢乐达人暗堡辅助,操作教程(有人有挂)-哔哩哔哩1、完成欢乐达人暗堡辅助...
透视辅助!哈糖大菠萝怎么开挂,... 透视辅助!哈糖大菠萝怎么开挂,来几局是正规平台吗,法门教程(有挂分享)-哔哩哔哩1、任何哈糖大菠萝怎...
曝光透视!如何下载wepoke... 曝光透视!如何下载wepoker安装包,微乐自建房免费辅助入口在哪里,大纲教程(有挂秘诀)-哔哩哔哩...
一直以来!来物局潮汕辅助,蛮王... 一直以来!来物局潮汕辅助,蛮王辅助器,要领教程(有挂辅助)-哔哩哔哩1、每一步都需要思考,不同水平的...
连日来!智星菠萝透视,心悦填大... 连日来!智星菠萝透视,心悦填大坑辅助,策略教程(有人有挂)-哔哩哔哩心悦填大坑辅助辅助器是一种具有地...
解密透视!wepoker手机版... 解密透视!wepoker手机版辅助,微乐小程序多功能修改器,指南书教程(有挂方法)-哔哩哔哩1、we...
经调查!新天道透视辅助器免费,... 经调查!新天道透视辅助器免费,新道游开挂辅助透视,演示教程(有挂细节)-哔哩哔哩1、下载好新天道透视...
做出回应!竞技联盟透视,菠萝德... 做出回应!竞技联盟透视,菠萝德普辅助器免费版在哪里,绝活儿教程(有挂解密)-哔哩哔哩做出回应!竞技联...
推荐透视!wepoker祈福有... 推荐透视!wepoker祈福有用吗,微信微乐游戏苹果辅助器,法子教程(有挂规律)-哔哩哔哩1、推荐透...
这一问题亟待解决!神殿娱乐控制... 这一问题亟待解决!神殿娱乐控制系统,游戏老友地方有脚本吗,攻略教程(有挂方法)-哔哩哔哩1、每一步都...