【QT】使用QtConcurrent实时监测指定软件的运行状态

这篇具有很好参考价值的文章主要介绍了【QT】使用QtConcurrent实时监测指定软件的运行状态。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

测试实现监视指定名称的软件是否在运行,如果没有运行则像指定的IP发送监测结果。


提示:以下是本篇文章正文内容,下面案例可供参考

1.pro文件

QT       += core gui concurrent network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

FORMS += \
    mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

2.MainWindow.h

代码如下(示例):

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QProcess>
#include <QTimer>
#include <QDebug>
#include <QtConcurrentRun>
#include <QDragEnterEvent>
#include <QUrl>
#include <QFile>
#include <QMimeData>
#include <QTcpSocket>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void inItData();
    void WhetherProcessRunning();
    void IsRunning();
    void TCP_Receive_Data();                                            //接收板卡发送回来的TCP数据
    void slotdisconnected();                                            //与服务器端口连接处理函数
    void Connect_TCP_Server();
    void sendData(QString info);
signals:
    void send_statue(QString runStatue = "");
private slots:
    void getAppRunStatue(QString runStatue);
    void TCP_SerialPort_Status();

private:
    Ui::MainWindow *ui;
    QTimer monitorTimer;
    QString appName;
    bool statue;
    QTcpSocket TCP_clientSocket;                          //TCP套接字
    QTimer Serial_port_status_timer;
    int TCP_Reconnection_times = 0;
    QString appStatue;
private:
    void dragEnterEvent(QDragEnterEvent *event);
    void dropEvent(QDropEvent *event);
    void closeEvent(QCloseEvent *event);
};
#endif // MAINWINDOW_H

3.MainWindow.cpp

代码如下(示例):

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDir>
#include <QThread>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    inItData();
    Connect_TCP_Server();

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::inItData()
{
    setAcceptDrops(true);
    //初始化TCP对象
    connect(&TCP_clientSocket,&QTcpSocket::readyRead, this, &MainWindow::TCP_Receive_Data);         //读到TCP服务器传来的信号
    connect(&TCP_clientSocket, &QTcpSocket::disconnected, this, &MainWindow::slotdisconnected);
    connect(&monitorTimer, &QTimer::timeout, this, &MainWindow::IsRunning);
    connect(this, &MainWindow::send_statue, this, &MainWindow::getAppRunStatue);
    connect(&Serial_port_status_timer,&QTimer::timeout,this,&MainWindow::TCP_SerialPort_Status);//实时更新端口号
    IsRunning();
    monitorTimer.start(1000);
}


void MainWindow::WhetherProcessRunning()
{
    QProcess process;
    QString cmd = "tasklist";
    process.start(cmd);
    process.waitForFinished();                    //等待进程结束
    QString str = process.readAllStandardOutput();//获取执行命令后的输出内容
    if(str.contains(appName) && !appName.isEmpty())//判断是否有包含当前指定的进程名
    {
        appStatue = "运行中";
    }
    qDebug() << "子线程ID: " << QThread::currentThreadId();
    emit send_statue();
}

void MainWindow::IsRunning()
{
    appStatue = "未运行";
    appName = ui->lineEdit->text().trimmed();
    qDebug() << "主线程ID: " << QThread::currentThreadId();
    QtConcurrent::run(this,&MainWindow::WhetherProcessRunning);
}

void MainWindow::getAppRunStatue(QString runStatue)
{
    qDebug()<< "运行状态: " << appStatue;
    ui->label_3->setText(appStatue);
    if(appStatue == "运行中")
        ui->label_3->setStyleSheet("font-size:24px; color: rgb(85, 170, 0);");
    if(appStatue == "未运行" && TCP_clientSocket.isOpen())
    {
        ui->label_3->setStyleSheet("font-size:26px; color: rgb(237,28,36);");
        sendData(QString("软件%1运行状态: %2").arg(appName).arg(appStatue));
    }
}

//拖动进入事件
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
    //可打开.txt,.h,.cpp文件
    if(event->mimeData()->hasUrls())   //数据中是否包含URL
    {
        event->acceptProposedAction(); //如果是则接受动作
    }
    else
        event->ignore();
}

//放下事件
void MainWindow::dropEvent(QDropEvent *event)
{
    const QMimeData *mimeData = event->mimeData();
    if(mimeData && mimeData->hasUrls())
    {
        QList<QUrl>urlList = mimeData->urls();
        QString fileName = urlList.at(0).toLocalFile();
        qDebug()<< "fileName = " << fileName;
        QString suffix = fileName.mid(fileName.lastIndexOf("/")+1,100);
        qDebug()<< "suffix = " << suffix;
    }
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    if(TCP_clientSocket.isOpen())
    {
        TCP_clientSocket.disconnect();
        monitorTimer.stop();
        Serial_port_status_timer.stop();
        TCP_clientSocket.close();
    }
    QMainWindow::closeEvent(event);
}

void MainWindow::Connect_TCP_Server()
{
    TCP_clientSocket.abort();
    TCP_clientSocket.connectToHost("192.168.0.102", 4001);
    if(!TCP_clientSocket.waitForConnected(3000))
    {
        qDebug()<< "连接失败!";
        return;
    }
}

//接收板卡发送回来的TCP数据
void MainWindow::TCP_Receive_Data()
{
    //获取对方发送的内容
    QByteArray info = TCP_clientSocket.readAll();
    QString data = QString::fromUtf8(info);
    qDebug()<< "data: " << data;
}

//与服务器端口连接处理函数
void MainWindow::slotdisconnected()
{
    qDebug() << " 连接状态: 已断开(TCP)";
    Serial_port_status_timer.start(3000);    //连接断开时开启定时器,定时时间为3s
}

//向板卡发送数据
void MainWindow::sendData(QString info)
{
    //通过TCP向板卡发送数据
    QByteArray TCP_Data = info.toUtf8();
    qDebug()<< "发送的消息的TCP数据 = " << TCP_Data << "info = " << info;
    TCP_clientSocket.write(TCP_Data);
//    bool statue = TCP_clientSocket.waitForReadyRead(1500);
//    if( statue == false)
//    {
//        qDebug()<< "无数据返回!";
//        return;
//    }
}

void MainWindow::TCP_SerialPort_Status()
{
    QString StatusBarMessage;
    if(TCP_Reconnection_times == 10)
    {
        TCP_Reconnection_times = 0;
        Serial_port_status_timer.stop();
        StatusBarMessage = tr(" 设备重连失败!");
        qDebug()<< StatusBarMessage;
        ui->statusbar->setStyleSheet("font-size:18px; color: rgb(237,28,36);");
        ui->statusbar->showMessage(StatusBarMessage);
        return;
    }
    TCP_clientSocket.abort();
    TCP_clientSocket.connectToHost("192.168.0.102", 4001);
    ui->statusbar->setStyleSheet("font-size:18px; color: rgb(237,28,36);");
    StatusBarMessage = tr(" 正在重新连接...");
    qDebug()<< StatusBarMessage;
    ui->statusbar->showMessage(StatusBarMessage);
    if(!TCP_clientSocket.waitForConnected(1500))
    {
        TCP_Reconnection_times++;       //没重连一次失败次数加一,重连失败10次后停止重连
        ui->statusbar->setStyleSheet("font-size:18px; color: rgb(237,28,36);");
        StatusBarMessage = QString(tr(" 请求超时,连接失败!(重连次数: %1 )")).arg(TCP_Reconnection_times);
        qDebug()<< StatusBarMessage;
        ui->statusbar->showMessage(StatusBarMessage);
        return;
    }
    else
    {
        TCP_Reconnection_times = 0;
        Serial_port_status_timer.stop();
        ui->statusbar->setStyleSheet("font-size:18px; color: rgb(85, 170, 0);");
        StatusBarMessage = tr(" 连接状态: 已连接(TCP)");
        qDebug()<< StatusBarMessage;
        ui->statusbar->showMessage(StatusBarMessage);
    }
}


4.效果演示

指定监控软件运行状态,qt,开发语言,ui文章来源地址https://www.toymoban.com/news/detail-799370.html

到了这里,关于【QT】使用QtConcurrent实时监测指定软件的运行状态的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 监测服务器硬件设备运行状况的软件 - wgcloud

    监测服务器硬件设备运行状况的软件 - wgcloud

    WGCLOUD是一款开源免费的运维平台,具有轻量,高效,性能稳定,部署简单,上手容易等特点 WGCLOUD可以监测服务器的cpu,内存,磁盘,负载,磁盘,缓存,网络流量,系统信息,温度,硬盘健康等指标数据,这些都不要做配置,默认自动监控 WGCLOUD的版本更新非常活跃,几乎

    2024年02月02日
    浏览(11)
  • Ubunutu18.04+Qt5.14+Dlib19.24+Opencv3.4.16实时人眼监测实验

    Ubunutu18.04+Qt5.14+Dlib19.24+Opencv3.4.16实时人眼监测实验

      在Ubuntu18.04实现的一个人眼监测小程序,使用Qt5.14、Dlib19.24、Opencv3.4.16实现。   其主要实现思想是,首先通过 Opencv 获取摄像头数据,然后通过 Dlib 提取人脸68关键点的算法对所输入图片中的人脸进行关键点检测,检测出眼部的关键点后,在用 Opnecv 中的画图命令进行绘制

    2023年04月13日
    浏览(12)
  • PyCharm 调试过程中控制台 (Console) 窗口内运行命令 - 实时获取中间状态

    PyCharm 调试过程中控制台 (Console) 窗口内运行命令 - 实时获取中间状态

    ​​​ [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

    2024年02月20日
    浏览(18)
  • 【修改完Qt的UI界面再运行却不能实时更新的解决方法】

    如博客标题所述。例如:当我们在ui界面中添加了某个控件(如按钮)之后,右键项目名称点击运行(对应绿色右三角),显示的界面却还是原来未修改的界面。 这个问题在网上已经有很详细的解释了。具体地,首先需要明白,在我们更改完ui界面、点击运行之后将会重新产

    2024年02月12日
    浏览(9)
  • QtConcurrent和QFuture的使用

    QtConcurrent和QFuture的使用

            在Qt中,有时候我们会遇到这样一种情况,需要执行一个很长时间的操作,这时候我们的主界面就会卡住。我们的通常做法就是把这个很长时间的操作扔到线程里去处理,可以使用标准库中的线程也可以使用QThread。         如果我们要在这个很长时间的操作之

    2024年02月11日
    浏览(8)
  • 【Linux】之nc命令(连接与扫描指定端口、监测服务端口的使用情况)解析、详解实例、邮件告警

    【Linux】之nc命令(连接与扫描指定端口、监测服务端口的使用情况)解析、详解实例、邮件告警

    👨‍🎓 博主简介   🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊 交流社区: 运维交流社区 欢迎大家的加入! 🐋 希望大家多多支持,我们一起进步!😄 🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏

    2024年02月02日
    浏览(10)
  • C++语言Qt实现 实时任务调度仿真软件 任务参数可配置和随机生成支持多核调度

    C++语言Qt实现 实时任务调度仿真软件 任务参数可配置和随机生成支持多核调度

    我遇到个需求: 目标: 开发一个实时任务调度仿真软件,我们在学习操作系统这门课时候,经常需要观察任务动态调度情况,来更好的直观学习操作系统任务调度过程和调度算法。 内部原理: 操作系统任务调度实际上是一个有限状态机,任务的各种状态不断的转换过程,我

    2023年04月25日
    浏览(13)
  • qt软件正常运行的崩溃了定位行号方法

    软件(debug版exe或者release版exe)在正常运行状态下(不是gdb调试运行),如果软件崩掉,那么会直接闪退,软件什么也做不了,此时无法保存软件中的状态信息,此外,也无法提供任何软件崩溃原因的信息。因此,软件崩掉,我们需要能给出信息才行,指导我们修改源码。解

    2024年02月07日
    浏览(9)
  • keil软件调试查看语句运行时间,单片机IO口状态,变量窗口设置,晶振设置。

    keil软件调试查看语句运行时间,单片机IO口状态,变量窗口设置,晶振设置。

    上一篇文章介绍了keil软件调试(Debug)仿真教程(软件调试和硬件调试的区别)及常用调试按键详解,本篇文章主要学习的是软件调试里面,如何设置单片机晶振( 用来确定单片机工作频率 ),如何查看单片机IO口引脚( 用来观察IO口当前高低电平 )如何查看单条语句运行

    2024年02月09日
    浏览(6)
  • Linux中使用nvidia-smi命令实时查看指定GPU使用情况

    Linux中使用nvidia-smi命令实时查看指定GPU使用情况

    参考:使用watch和nvidia-smi命令实时查看GPU使用、显存占用情况 nvidia-smi :可以查看显卡的型号、驱动版本、显卡目前温度、显存已使用及剩余、正使用显卡的所有进程及占用显存等信息; watch -n 5 nvidia-smi :5代表每隔5秒刷新一次GPU使用情况,同理,每隔1秒刷新,则使用:w

    2024年01月22日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包