Linux中利用消息队列给两个程序切换显示到前台

消息队列--两个进程间的通信

需求:

  • 1.在Linux系统中
  • 2.两个ui界面的程序切换,一个显示,另一个隐藏

.h

cpp 复制代码
#ifndef PROGRAMWINDOWSWITCH2_H
#define PROGRAMWINDOWSWITCH2_H

#include <QObject>
#include <QThread>
#include <QMainWindow>

struct Message{
    long msgType;
    int msgText[2];
};

class MessageQueueReceiver : public QThread
{
    Q_OBJECT
public:
    MessageQueueReceiver(int msgid,QObject *parent = nullptr,int type = 1):QThread(parent),msgid(msgid),curWindowType(type){}

signals:
    void messageReceived(const int &message);

protected:
    void run() override;

private:
    int msgid;
    int curWindowType;
};

class programwindowswitch2 : public QObject
{
    Q_OBJECT
public:
    enum WindowType{
        ConfigWindow = 1,
        ControlWindow = 2
    };
    explicit programwindowswitch2(QObject *parent = nullptr,WindowType type = ConfigWindow);

signals:
    void showWindowSignal(void);
    void ChangedWindow(void);
public slots:
    void vSwitchOtherWindow(bool flag= true);

private slots:
    void handleMessage(const int &message);

private:
    int msgid;
    MessageQueueReceiver *m_receiver;

    QWidget *pMainWidget;
    WindowType curWindowType;
};

#endif // PROGRAMWINDOWSWITCH2_H

.cpp

cpp 复制代码
#include "programwindowswitch2.h"
#include <QMutex>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <iostream>

#include <QDebug>

programwindowswitch2::programwindowswitch2(QObject *parent,WindowType type) : QObject(parent),curWindowType(type)
{
    pMainWidget = static_cast<QMainWindow*>(parent);

    key_t key = ftok("myMessage",35);
    msgid = msgget(key,0666 | IPC_CREAT);

    m_receiver = new MessageQueueReceiver(msgid,this,curWindowType);
    connect(m_receiver,&MessageQueueReceiver::messageReceived,this,&programwindowswitch2::handleMessage);
    m_receiver->start();
}

void MessageQueueReceiver::run()
{
    Message msg;
    while (true) {
        if(msgrcv(msgid,&msg,sizeof(msg),curWindowType,0) > 0){
            emit messageReceived(msg.msgText[0]);
        }
    }
}

void programwindowswitch2::vSwitchOtherWindow(bool flag)
{
    Message msg;

    if(pMainWidget == nullptr)
        return;

    switch (curWindowType) {
    case ConfigWindow:
        msg.msgType = 2;
        msg.msgText[0] = flag;
        break;
    case ControlWindow:
        msg.msgType = 1;
        msg.msgText[0] = flag;
        break;
    default:
        return;
        break;
    }

    msgsnd(msgid,&msg,sizeof(msg),0);
}

//show windows
void programwindowswitch2::handleMessage(const int &message)
{
    bool show_flag = false;

    if(pMainWidget == nullptr)
        return;

    switch (curWindowType) {
    case ConfigWindow:
        if(message == 1){
            show_flag = true;
        }
        break;
    case ControlWindow:
        if(message == 1){
            show_flag = true;
        }
        break;
    default:
        break;
    }
    if(show_flag){
        emit ChangedWindow();
        pMainWidget->show();
        vSwitchOtherWindow(false);
    }
    else {
        pMainWidget->hide();
    }
}
相关推荐
Ruiery5 小时前
Linux 6.6内核内存管理深度解析(十六):mmap — 用户态“申请内存“的真相
linux·运维·服务器
欧米欧6 小时前
Linux系统篇(七),环境变量的底层溯源,核心获取机制与安全应用
linux·运维·服务器
Ruiery6 小时前
Linux 6.6内核内存管理深度解析(十八):KASLR 内核地址空间随机化
linux·运维·服务器·安全
Sakura_j_h_6 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
qetfw7 小时前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
程序喵大人7 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
逆风的蚂蚁8 小时前
linux服务器性能调整怎么落地?我把 CPU 调度、I/O 优先级和内核参数这几个旋钮都拧了一遍
linux·运维·服务器
jimy19 小时前
C++ 中的 `T&&`:右值引用与转发引用
开发语言·c++
会编程的小孩11 小时前
C++ 定时器
c++
沫璃染墨12 小时前
从零入门计算机网络系列(十一):HTTP协议进阶——从重定向原理到GET/POST与Fiddler抓包
linux·服务器·开发语言·网络·c++·tcp/ip·html