Qt的Windows Service程序与QSharedMemory之间互用

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链接

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值