1:Qt的service程序应用的demo
2:Qt的共享内存运用的demo
以下为项目代码:
monitorService.h
#ifndef MONITORSERVICE_H
#define MONITORSERVICE_H
#include "qtservice.h"
#include "ui_proc_monitorservice_desktop.h"
class MonitorService : public QtService<QCoreApplication>
{
public:
MonitorService(int argc, char **argv);
protected:
// 开始服务程序
void start();
// 暂停服务程序
void pause();
// 停止服务程序
void stop();
// 恢复服务程序
void resume();
private:
UI_Proc_MonitorService_Desktop *monitorService;
};
#endif // MONITORSERVICE_H
monitorService.cpp
#include <QCoreApplication>
#include <QDebug>
#include "monitorservice.h"
MonitorService::MonitorService(int argc, char **argv): QtService<QCoreApplication>(argc, argv, "MIG Daemon")
{
setServiceDescription("A dummy MIG service implemented with Qt");
setServiceFlags(QtServiceBase::CanBeSuspended);
}
void MonitorService::start()
{
QtServiceBase::logMessage("Start Suceess!!!!");
// QCoreApplication *app = application();
// Q_UNUSED(app);
qDebug() <<"start";
monitorService = new UI_Proc_MonitorService_Desktop;
try{
QtServiceBase::logMessage("run!!!!");
monitorService->changeRun();
}
catch(...){
QtServiceBase::logMessage("not run!!!!");
// app->quit();
}
}
void MonitorService::pause()
{
QtServiceBase::logMessage("Pause Suceess!!!!");
}
void MonitorService::stop()
{
QtServiceBase::logMessage("Stop Suceess!!!!");
}
void MonitorService::resume()
{
QtServiceBase::logMessage("resume Suceess!!!!");
}
以上为创建一个服务程序,可以根据1链接去启动。
monitorService_Desktop.h
#ifndef UI_PROC_MONITORSERVICE_DESKTOP_H
#define UI_PROC_MONITORSERVICE_DESKTOP_H
#include <QObject>
#include <QSharedMemory>
#include <thread>
#include <QTime>
#include "ui_proc_monitorservice_desktop_global.h"
class UI_PROC_MONITORSERVICE_DESKTOPSHARED_EXPORT UI_Proc_MonitorService_Desktop: public QObject
{
Q_OBJECT
public:
UI_Proc_MonitorService_Desktop(QObject *parent = 0);
void changeRun();
void pause();
void resume();
void stop();
private:
void tdCircuCommunication();
void delayMSec(unsigned int msec);
private:
QSharedMemory mSharedMemory;
};
#endif // UI_PROC_MONITORSERVICE_DESKTOP_H
monitorServer_Desktop.cpp
#include <QCoreApplication>
#include <QDebug>
#include "ui_proc_monitorservice_desktop.h"
#include "process_loader.h"
UI_Proc_MonitorService_Desktop::UI_Proc_MonitorService_Desktop(QObject *parent): QObject(parent)
{
//服务程序初始化时就生成共享内存"MIG"
mSharedMemory.setKey("test");
if(mSharedMemory.isAttached()){
mSharedMemory.detach();
}
mSharedMemory.attach(QSharedMemory::ReadWrite); //共享内存只读的模式
int size = 1024;
mSharedMemory.create(size);
char *mto = (char*)mSharedMemory.data();
const char *mfrom = "Unconnected"; //未连接状态
mSharedMemory.lock(); //锁定
memcpy(mto, mfrom, qMin(mSharedMemory.size(), size));
mSharedMemory.unlock(); //解锁
}
void UI_Proc_MonitorService_Desktop::changeRun()
{
std::thread td(std::bind(&UI_Proc_MonitorService_Desktop::tdCircuCommunication, this));
td.detach(); //不等待子线程
}
void UI_Proc_MonitorService_Desktop::tdCircuCommunication()
{
//循环与主进程进行通讯
while(1){
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
mSharedMemory.setKey("MIG");
mSharedMemory.attach(QSharedMemory::ReadOnly);
mSharedMemory.lock();
char *from = (char*)mSharedMemory.constData();
QString str = QString("%1").arg(from);
qDebug() <<" +++++++++++++ " <<str ;
if(str == "Unconnected"){
//TODO
qDebug() << "Unconnected";
mSharedMemory.unlock();
}
if(str == "Running"){
//TODO
qDebug() << "Running";
mSharedMemory.unlock();
}
if(str == "Quit"){
//TODO
qDebug() << "Quit";
mSharedMemory.unlock();
}
if(str == "Crash"){
//TODO crash
qDebug() << "Crash";
mSharedMemory.unlock();
}
}
}
void UI_Proc_MonitorService_Desktop::delayMSec(unsigned int msec)
{
QTime _Timer = QTime::currentTime().addMSecs(msec);
while( QTime::currentTime() < _Timer )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
以上为读取共享内存内的内容,进行逻辑操作(创建共享内存也在上面的代码中)如有不懂请看2链接