Qt优秀开源项目之十八:QtService

news2024/12/25 17:13:35

QtService是一个用于实现Windows服务或unix守护进程的开源项目
github地址:https://github.com/qtproject/qt-solutions/tree/master/qtservice
源码可以编译成动态库,也可以直接在项目中引用源码
源码目录qtservice/examples中包含了三个例子,值得参考

一.试用

1.新建一个控制台程序TestServer2

然后将qtservice源码拷贝到项目中

参考例子qtservice/examples/server,写一个最简单的Windows服务

#include <QCoreApplication>
#include <QDebug>

#include "qtservice.h"

class TestService2 : public QtService<QCoreApplication>
{
public:
    TestService2(int argc, char **argv) : QtService<QCoreApplication>(argc, argv, "TestService2")
    {
        setServiceDescription("TestService2 cao shang pa");
        setServiceFlags(QtServiceBase::CanBeSuspended);
    }

    ~TestService2(){};

protected:
    void start()override
    {

        // 将服务要做的事情放在这里.
        qDebug() << Q_FUNC_INFO;
    }
    void stop()override
    {
        qDebug() << Q_FUNC_INFO;
    }
    void pause()override
    {

    }
    void resume()override
    {

    }
};

int main(int argc, char *argv[])
{
    TestService2 service(argc, argv);
    return service.exec();
}

pro文件如下

QT -= gui

CONFIG += c++11 console
CONFIG -= app_bundle

DESTDIR = out

SOURCES += \
        main.cpp

include(qtservice/src/qtservice.pri)

这样一个Windows服务程序就完成了,是不是超简单。

2.在工程文件pro中添加源码引用

include(qtservice/src/qtservice.pri)

3.运行

以管理员权限启动cmd窗口,cd到TestService2/out,执行:

TestService2.exe -h

输出基本用法


①安装服务

TestService2.exe -i


此时在“计算机管理”窗口中可以看到安装的服务,不过此时的服务并未运行


②启动服务

TestService2.exe

直接这样就行,没有参数,此时服务显示正在运行


③停止服务

TestService2.exe -t

④卸载服务

TestService2.exe -u

其他的参数可以自己尝试

PS:如果想在代码中控制服务,参考这个例子qtservice/examples/controller

二.原理

之前分享过C++之创建Windows系统服务,QtServer在Windows上的实现,实际上也是调用的WIndows API,如下图所示


其实所有第三方库底层原理都一样,都是调用的系统API,能够脱颖而出的必然是接口简单、性能牛叉的。QtServer使复杂的工作不仅简单化,还人性化——当执行TestService2.exe -e时,TestService2.exe就是一个普通的Qt应用程序,start函数中的调试信息能直接打印到控制台上。不用像C++之创建Windows系统服务中那样使用DebugView来捕获调试信息了

原文链接:https://blog.csdn.net/caoshangpa/article/details/130276690

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/441384.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】system V 消息队列 | system V 信号量(简单赘述)

文章目录 1 . system V 消息队列(了解)接口查看消息队列 2.system V 信号量 (了解)1.进程互斥等概念的理解2.认识信号量3. 接口 这两部分主要是了解即可&#xff0c;为后面学习做铺垫 1 . system V 消息队列(了解) 为了让两个进程间通信 创建一个队列queue 进程A可以通过消息队…

Python——第2章 数据类型、运算符与内置函数

目录 1 赋值语句 2 数据类型 2.1 常用内置数据类型 2.1.1 整数、实数、复数 2.1.2 列表、元组、字典、集合 2.1.3 字符串 2.2 运算符与表达式 2.2.1 算术运算符 2.2.2 关系运算符 2.2.3 成员测试运算符 2.2.4 集合运算符 2.2.5 逻辑运算符 2.3 常用内置…

Kubernetes 笔记(15)— 应用保障、容器资源配额、容器状态探针概念及使用

作为 Kubernetes 里的核心概念和原子调度单位&#xff0c;Pod 的主要职责是管理容器&#xff0c;以逻辑主机、容器集合、进程组的形式来代表应用&#xff0c;它的重要性是不言而喻的。 在上层 API 对象的基础上&#xff0c;一起来看看在 Kubernetes 里配置 Pod 的两种方法&…

dell t630服务器风扇控制笔记记录(耗时一天)

1、打开虚拟控制台得用IE&#xff1b; 2、Dell PowerEdge T640 加装显卡之后风扇狂转问题解决 - 知乎 感谢知乎Billy&#xff0c; 操作步骤&#xff1a; 1、查看iDrac版本&#xff0c;必须在3.30.30.30及以下&#xff0c;之后的版本关闭了手动控制风扇转速的权限&#xff0…

从视图树到GPU:探索Android渲染机制

简介 在 Android 中&#xff0c;渲染技术可以分为 CPU 渲染和 GPU 渲染两种方式。CPU 渲染是直接使用 CPU 处理数据&#xff0c;并将其显示在屏幕上&#xff0c;而 GPU 渲染则是将数据传递给 GPU 进行处理和显示。 具体的渲染技术如下&#xff1a; Canvas绘图&#xff1a;An…

多层感知器介绍

一、概览 现实世界中很多真实的问题都不是线性可分的&#xff0c;即无法使用一条直线、平面或者超平面分割不同的类别&#xff0c;其中典型的例子是异或问题&#xff08;Exclusive OR&#xff0c;XOR&#xff09;&#xff0c;即假设输入为x1和x2&#xff0c;如果它们相同&…

Linux远程访问及控制SSH命令

目录 一. SSH服务1.1 SSH基础1.1.1什么是SSH服务器&#xff1f;1.1.2SSH优点1.1.3常见的ssh协议 二. 服务端配置文件常用选项2.1设置白名单2.2设置黑名单 三. SSH服务的两种验证方式3.1 公钥与私钥的关系 四. ssh客户端程序4.1ssh远程登录4.2 scp 远程复制4.3 sftp 安全的ftp 五…

Direct3D 12——计算着色器——计算着色器概念

计算着色器虽然是一种可编程的着色器&#xff0c;但Direct3D并没有将它直接归为渲染流水线中的一部分。虽然如此&#xff0c;但位于流水线之外的计算着色器却可以读写GPU资源。从本质上来说&#xff0c;计算着 色器能够使我们访问GPU来实现数据并行算法&#xff0c;而不必渲染出…

ESP32设备驱动-BH1745NUC 亮度和颜色传感器驱动

BH1745NUC 亮度和颜色传感器驱动 文章目录 BH1745NUC 亮度和颜色传感器驱动2、硬件准备3、软件准备4、驱动实现BH1745NUC 是具有 IC 总线接口的数字颜色传感器 IC。 该 IC 感应红光、绿光和蓝光 (RGB) 并将它们转换为数字值。 高灵敏度、宽动态范围和出色的 Ircut 特性使该 IC …

【CSS3】CSS3 伪元素字体图标 ( 生成 icommon 字体文件 | 字体图标基本使用 | 使用伪元素实现 icommon 字体图标显示 )

文章目录 一、icommon 字体图标基本使用1、生成 icommon 字体文件2、字体图标基本使用 二、使用伪元素实现 icommon 字体图标显示 一、icommon 字体图标基本使用 字体图标 指的是 将图标做成字体样式 , 在 放图标的地方 使用 文字 即可实现 图标显示 ; 1、生成 icommon 字体文件…

Vue2-黑马(十三)

目录&#xff1a; &#xff08;1&#xff09;实战-permissions.js-动态路由 &#xff08;2&#xff09;实战-第三方登录-流程分析 &#xff08;3&#xff09;实战-第三方登录-代码解读 &#xff08;1&#xff09;实战-permissions.js-动态路由 在做根据用户角色动态生成路由…

【Unity+MySQL】实现注册登录系统(升级版)

目录 1 UI界面重新设计1.1 注册界面1.2 登录界面1.3 交互实现 2 注册功能完善2.1 判断用户输入的用户名是否与数据库中的重复2.2 将当前时间更新至用户表的当前注册时间列2.3 将用户输入的注册密码使用哈希加密 3 登录功能完善 接着 上篇文章所谈到的系统缺陷&#xff0c;这篇…

==与equals()的理解

java中的数据类型分为基本数据类型、基本数据类型对应的包装类型&#xff08;引用类型&#xff09;&#xff0c;引用类型三种数据类型。 每一个基本类型java都提供了一个与之对应的包装类型&#xff0c;该包装类型是一个引用类型,并且在基本类型与包装类型之间提供了自动拆箱和…

AD21原理图----网络连线(网络线、网络标签、总线、差分对、信号线束)

目录 网络连线 网络线&#xff08;Wire&#xff09; 网络标签 总线 差分对 信号线束 网络连线 网络线&#xff08;Wire&#xff09; 网络标签 可以跨原理图 总线 用于放置同一类数据 使用步骤 第一步&#xff1a;先绘制网络线 第二步&#xff1a;利用网络标签进行连接&a…

虚拟机下Ubuntu系统的Docker部署

虚拟机下Ubuntu系统的微服务项目Docker部署 文章目录 虚拟机下Ubuntu系统的微服务项目Docker部署1、Ubuntu安装 Docker2、修改后端微服务的配置2.1 修改 MySQL 的配置2.2 修改 Redis 的配置2.3 修改 Nacos 的配置 3、生成微服务镜像4、拉取远程镜像5、生成前端镜像5.1 准备文件…

MacOS安装MongoDB与Redis

1.安装MongoDB: brew tap mongodb/brew brew install mongodb-community 后台服务方式运行mongodb: brew services restart mongodb/brew/mongodb-community 直接运行mongodb非后台服务 /usr/local/opt/mongodb-community/bin/mongod --config /usr/local/etc/mongod.con…

化工行业数字化“智能工厂”-解决方案(ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 总体架构 设计理念—数据集成与流转 九大核心价值之一 九大核心价值之二 九大核心价值之三 九大核心价值之四 九大核心价值之五 九大核心价值之六 九大核心价值之七 九大核心…

数据库学习-常用的SQL语句

背景&#xff1a; 汇整一下自己学习数据库过程中常见的题目及语句。 一.实例分析题 二&#xff0e;简单SQL查询&#xff1a; 1&#xff09;:统计每个部门员工的数目select dept,count(*) from employee group by dept;2&#xff09;:统计每个部门员工的数目大于一个的记录se…

3.4 迭代法

4.1 雅克比迭代法&#xff1a; 雅可比迭代法是一种用于求解线性方程组的迭代算法&#xff0c;其基本思想是将线性方程组中的系数矩阵拆分为对角线矩阵和非对角线矩阵两部分&#xff0c;并利用对角线矩阵的逆矩阵来迭代求解方程组。 具体地&#xff0c;设线性方程组为Axb&…

操作系统笔记--虚拟内存的使用

1--背景概念 在计算机系统中&#xff0c;当多道程序同时运行时可能会出现内存不足的情况&#xff0c;一般可通过以下技术进行解决&#xff1a; 覆盖技术&#xff1a; 当程序太大超出内存容量时&#xff0c;可以采用手动覆盖的技术&#xff0c;只把需要的指令和数据保存在内存当…