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