消息队列–两个进程间的通信
需求:
- 1.在Linux系统中
- 2.两个ui界面的程序切换,一个显示,另一个隐藏
.h
#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
#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();
}
}