Qt监控后台服务运行状态

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMap>
#include <QTimer>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    void getAllAppPidList(QMap<QString, qint64> &app_pid);
    void OpenServiceManager();
private slots:
    void scanTable();

    void on_pushButton_add_progress_clicked();

    void on_pushButton_add_service_clicked();

private:
    Ui::MainWindow *ui;
    QTimer* scanTimer;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include <windows.h>// for OpenService
#include <tlhelp32.h>// for CreateToolhelp32Snapshot
#include <Psapi.h>   // for GetModuleFileNameEx
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
/*
 *
 * =================================================================
 * !!!!!!!!!!!!!本程序需要管理员身份运行!!!!!!!!!!!!!!!
 * =================================================================
 *
 * */

//使用带bom的UTF8文件格式,在Tools-Options-Text Editor-Behavior-File Encoding-UTF-8 BOM:Add If Emcoding Is UTF-8
#pragma execution_character_set("utf-8")

SC_HANDLE hSCM;

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

    scanTimer = new QTimer(this);
    connect( scanTimer, SIGNAL(timeout()), SLOT(scanTable()) );
    scanTimer->start( 10 );  // for 100fps

    OpenServiceManager();
}

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

void MainWindow::scanTable()
{
    //进程
    for(int row=0; row<ui->tableWidget_progress->rowCount(); row++)
        for(int col=0; col<ui->tableWidget_progress->columnCount();col++)
        {
            QTableWidgetItem* item = ui->tableWidget_progress->item(row,col);
            if(item!=NULL)
            {
                QString app=item->text();
            }
        }

    //检测服务是否在运行
    if(hSCM)
    {
        for(int row=0; row<ui->tableWidget_service->rowCount(); row++)
            for(int col=0; col<ui->tableWidget_service->columnCount();col++)
            {
                QTableWidgetItem* item = ui->tableWidget_service->item(row,col);
                if(item!=NULL)
                {
                    QString serviceName=item->text();
                    SC_HANDLE hService = ::OpenService( hSCM, serviceName.toStdWString().data(), SERVICE_ALL_ACCESS );
                    if(hService)
                    {
                        SERVICE_STATUS ssStatus;
                        QueryServiceStatus(hService,&ssStatus);//查看该Service的状态
                        if(ssStatus.dwCurrentState==SERVICE_STOPPED)
                        {
                            ::StartService( hService, 0, NULL );
                            ui->textEdit->append("StartService "+serviceName);
                        }
                        else if(ssStatus.dwCurrentState==SERVICE_RUNNING)
                        {
                            item->setBackground(Qt::green);
                        }
                        CloseServiceHandle(hService);
                    }
                    else
                    {
                        //ui->textEdit->append("OpenService Failed  "+serviceName);
                        item->setBackground(Qt::red);
                    }
                }
            }
    }
}

void MainWindow::OpenServiceManager()
{
    /*
     *
     *
     * 以下服务相关操作需要管理员权限
     *
     *
     *
     * */
    hSCM = ::OpenSCManager(NULL, // local machine
                           NULL, // ServicesActive database
                           SC_MANAGER_ALL_ACCESS); // full access
    if (hSCM) {
        //hService = ::OpenService( hSCM, QString("STEPVR_MMAP_SERVICE").toStdWString().data(), SERVICE_ALL_ACCESS );
        //if(hService==NULL)
        //    ui->textEdit->append("OpenService Failed");
    }
    else
    {
        qDebug()<<"OpenSCManager Fail"<<GetLastError();
        ui->textEdit->append("OpenSCManager Failed");
    }
}

// 根据进程号获取exe所在文件绝对路径
/*QString GetPathByProcessID(DWORD pid)
{
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    if (!hProcess)
    {
        //QMessageBox::warning(NULL,"GetPathByProcessID","无权访问该进程");
        return "";
    }
    WCHAR filePath[MAX_PATH];
    DWORD ret= GetModuleFileNameEx(hProcess, NULL, filePath, MAX_PATH) ;
    QString file = QString::fromStdWString( filePath );
    //QMessageBox::warning(NULL,"GetPathByProcessID ret=", QString::number(ret)+":"+file);
    CloseHandle(hProcess);
    return ret==0?"":file;
}

// 获取机器上正在运行的全部exe
void MainWindow::getAllAppPidList(QMap<QString, qint64> &app_pid)
{
    app_pid.clear();
    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(pe32);
    HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if(hProcessSnap == INVALID_HANDLE_VALUE)
    {
        //warningLabel->setText("CreateToolhelp32Snapshot调用失败");
        return ;
    }
    BOOL bMore = Process32First(hProcessSnap,&pe32);
    while(bMore)
    {
        //printf("进程名称:%s\n",pe32.szExeFile);
        //printf("进程ID:%u\n\n",pe32.th32ProcessID);

        QString exeName = (QString::fromUtf16(reinterpret_cast<const unsigned short *>(pe32.szExeFile)));
        QString exePath = GetPathByProcessID( pe32.th32ProcessID );
        exePath = FORMAT_PATH( exePath );
        //qDebug()<<exePath.toLower();
        if( exePath.isEmpty() )
        {
            //warningLabel->setText("获取进程 " + exeName + " 路径失败");
        }
        else
        {
            app_pid[exePath] = pe32.th32ProcessID;
        }

        bMore = Process32Next(hProcessSnap,&pe32);
    }
    CloseHandle(hProcessSnap);
}*/

void MainWindow::on_pushButton_add_progress_clicked()
{
    ui->tableWidget_progress->insertRow(ui->tableWidget_progress->rowCount());
}

void MainWindow::on_pushButton_add_service_clicked()
{
    ui->tableWidget_service->insertRow(ui->tableWidget_service->rowCount());
}
时间: 2024-10-21 21:07:53

Qt监控后台服务运行状态的相关文章

使用 pm2-web 监控 pm2 服务运行状态

pm2-web 是一款 pm2 服务状态监控程序,基于 web . 安装 $ npm install -g pm2-web 运行(默认是在8080端口) $ pm2-web 配置 pm2-web 将会加载默认的配置文件(如果存在) pm2-web will load one of the following files if they exist (in order of preference) A file specified by the --config /path/to/config.j

微软公众云服务运行状态监控

?? 微软账户.Outlook.com.邮箱/人脉/日历.OneDrive等公众云服务运行状态监控地址如下: https://status.live.com

angular访问后台服务及监控会话超时的封装

angular访问后台服务及监控会话超时的封装 angular本身自带访问组件http和httpclient,组件本身都是异步模式访问.本文只列举了对http组件的封装同时也一同处理会话超时监控. 获取组件源码请入QQ群706224870,在群文件中下载. 入群验证消息codefc. 实现思路概述: 1.将请求入参和出参统一约定 2.封装方法将请求参数.数据处理方法.数据呈现方法.访问错误处理方法封装在一起,业务调用通过服务调用该封装方法, 同时把请求参数.数据处理方法.数据呈现方法.访问错误处

centos7使用monit监控服务运行状态

安装: yum -y install epel-release yum -y install monit 配置:vim /etc/monitrc set daemon 30 set log syslog set httpd port 2812 and use address 172.20.10.11 allow 172.20.10.2 allow admin:monit #with ssl { # enable SSL/TLS and set path to server certificate

基于SignalR实现B/S系统对windows服务运行状态的监测

通常来讲一个BS项目肯定不止单独的一个BS应用,可能涉及到很多后台服务来支持BS的运行,特别是针对耗时较长的某些任务来说,Windows服务肯定是必不可少的,我们还需要利用B/S与windows服务进行交互,来实现更好的用户体验,搭配redis,memcached等来实现分布式缓存,消息列队处理等等... 但是通常情况我们在B/S端是无法得知其依赖的windows服务当前处于什么样的运行状态,只能通过到server里面去进行查看,或者通过其他途径! 今天我们就通过SignalR来实现一个B/S端

Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务

Service后台服务.前台服务.IntentService.跨进程服务.无障碍服务.系统服务 本篇文章包括以下内容: 前言 Service的简介 后台服务 不可交互的后台服务 可交互的后台服务 混合性交互的后台服务 前台服务 IntentService AIDL跨进程服务 AccessibilityService无障碍服务 系统服务 部分源码下载 前言 作为四大组件之一的Service类,是面试和笔试的必备关卡,我把我所学到的东西总结了一遍,相信你看了之后你会对Service娓娓道来,在以后遇

RedisLive监控Redis服务

RedisLive监控Redis服务 RedisLive是由python编写的并且开源的图形化监控工具,非常轻量级,核心服务部分只包含一个web服务和一个基于redis自带的info命令以及monitor命令的监控服务,界面上只有一个基于BootStrap的web界面,非常简洁明了.除此之外,它还支持多实例监控,切换方便,而且配置起来也非常容易.监控信息支持redis存储和持久化存储(sqlite)两种方式. 注意:RedisLive是使用Python2.x编写,建议使用2.7,本次环境为Cen

Nagios监控nginx服务具体过程

1在nginx 服务器上安装nrpe客户端: Nginx的服务须要监控起来.不然万一down了而不及时修复,会影响web应用.例如以下web应用上面启动的nginx后台进程[[email protected] ~]# ps aux|grep nginxnobody   15294  0.0  0.0  22432  3464 ?        S    Jul03   0:05 nginx: worker process      nobody   15295  0.0  0.0  22432

System Center 2012 R2实例3&mdash;部署SCOM监控SharePoint11&mdash;服务监视

Sharepoint的提供的各种功能及服务大多是基于相应的Windows服务进行的,当Windows服务出现问题时,势必会影响到Sharepoint的功能服务,所以对相应的Windows服务监视是很必要的. 本节我们来设定对于Sharepoint场内服务器的Windows服务的监视. Sharepoint监控③:服务监视 警报阈值: 服务器 APP1 APP2 SCH1 WFE1 WFE2 World Wide Web Publishing Service 停止 停止 - 停止 停止 Share