• Qt应用Redis实现消息队列


     

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liulihuo_gyh/article/details/78425763

    类似BS模式,客户端发送任务请求给服务端,服务端将处理结果返回给客户端。 redis负责消息的存储和转发。

    仿真病人挂号看病,Patient进程进行挂号,Doctor进程进行看病 ,程序代码如下:

    ////////////////////////////////////////////Patient//////////////////////////////////////////// 

    Patient.h:

    1.  
      #include <QObject>
    2.  
       
    3.  
      class QRedis;
    4.  
       
    5.  
      class Patient : public QObject
    6.  
      {
    7.  
      Q_OBJECT
    8.  
       
    9.  
      public:
    10.  
      Patient(QObject *parent = nullptr);
    11.  
      ~Patient();
    12.  
       
    13.  
      public slots:
    14.  
      void pushTask(); //push任务
    15.  
       
    16.  
      private:
    17.  
      void popResult(); //pop结果
    18.  
      QRedis * m_redis;
    19.  
      };
    Patient.cpp
    1.  
      #include "patient.h"
    2.  
      #include "qredis.h"
    3.  
      #include <QTimer>
    4.  
      #include <QEventLoop>
    5.  
      #include <QThread>
    6.  
       
    7.  
      static const QString KEYTASK = "MARKTASK";
    8.  
      static const QString KEYRESULT = "MARKRESULT";
    9.  
       
    10.  
      Patient::Patient(QObject *parent)
    11.  
      : QObject(parent)
    12.  
      {
    13.  
      //初始化通道
    14.  
      m_redis = new QRedis(this);
    15.  
      m_redis->connectHost("127.0.0.1", 6379);
    16.  
      m_redis->auth("1234");
    17.  
       
    18.  
      qDebug() << "client thread id :" << int(QThread::currentThreadId());
    19.  
       
    20.  
      //轮询任务
    21.  
      QTimer * timer = new QTimer(this);
    22.  
      connect(timer, &QTimer::timeout, this, &Patient::popResult);
    23.  
      timer->start(20);
    24.  
       
    25.  
      m_redis->del(KEYRESULT);
    26.  
      m_redis->del(KEYTASK);
    27.  
      pushTask();
    28.  
      }
    29.  
       
    30.  
      Patient::~Patient()
    31.  
      {
    32.  
      }
    33.  
       
    34.  
      void Patient::pushTask()
    35.  
      {
    36.  
      static int i = 0;
    37.  
      QString task = QStringLiteral("%1号,姓名:%2,状态:%3").arg(++i).arg(QStringLiteral("病人%1").arg(i)).arg(QStringLiteral("挂号"));
    38.  
      qDebug() <<"======================================================== "<< task;
    39.  
      qDebug() << "thread id :" << int(QThread::currentThreadId());
    40.  
      qint64 ret = m_redis->rpush(KEYTASK, task);
    41.  
      }
    42.  
       
    43.  
      void Patient::popResult()
    44.  
      {
    45.  
      QString state;
    46.  
      QString taskData = m_redis->lpop(KEYRESULT);
    47.  
      if (taskData.compare("nil", Qt::CaseInsensitive) == 0 || taskData.isEmpty())
    48.  
      {
    49.  
      return;
    50.  
      }
    51.  
      QEventLoop loop;
    52.  
      QTimer::singleShot(5000, &loop, &QEventLoop::quit);
    53.  
      loop.exec();
    54.  
      pushTask();
    55.  
      }
    56.  
       
    main.cpp
    1.  
      #include <QtCore/QCoreApplication>
    2.  
      #include <QDebug>
    3.  
      #include <QThread>
    4.  
      #include "patient.h"
    5.  
       
    6.  
      int main(int argc, char *argv[])
    7.  
      {
    8.  
      QCoreApplication a(argc, argv);
    9.  
       
    10.  
      qDebug() << QString("main thread id = : %1").arg(int(QThread::currentThreadId()));
    11.  
       
    12.  
      QThread patientThread;
    13.  
      Patient patient;
    14.  
      patient.moveToThread(&patientThread);
    15.  
      patientThread.start();
    16.  
      return a.exec();
    17.  
      }

    /////////////////////////////////////////////////Docktor/////////////////////////////////////////////////

    Docktor.h

    1.  
      #pragma once
    2.  
       
    3.  
      #include <QObject>
    4.  
       
    5.  
      class QRedis;
    6.  
       
    7.  
      class Docktor : public QObject
    8.  
      {
    9.  
      Q_OBJECT
    10.  
       
    11.  
      public:
    12.  
      Docktor(QObject *parent = nullptr);
    13.  
      ~Docktor();
    14.  
       
    15.  
      public slots:
    16.  
      void popTask(); //pop任务
    17.  
       
    18.  
      private:
    19.  
      void pushResult(const QString &task); //push结果
    20.  
       
    21.  
      QRedis * m_redis;
    22.  
      };

    Docktor.cpp
    1.  
      #include "docktor.h"
    2.  
      #include "qredis.h"
    3.  
      #include <QTimer>
    4.  
      #include <QEventLoop>
    5.  
      #include <QThread>
    6.  
       
    7.  
      static const QString KEYTASK = "MARKTASK";
    8.  
      static const QString KEYRESULT = "MARKRESULT";
    9.  
       
    10.  
      Docktor::Docktor(QObject *parent)
    11.  
      : QObject(parent)
    12.  
      {
    13.  
      //初始化通道
    14.  
      m_redis = new QRedis(this);
    15.  
      m_redis->connectHost("127.0.0.1", 6379);
    16.  
      m_redis->auth("1234");
    17.  
       
    18.  
      QTimer * timer = new QTimer(this);
    19.  
      connect(timer, &QTimer::timeout, this, &Docktor::popTask);
    20.  
      timer->start(20);
    21.  
      }
    22.  
       
    23.  
      Docktor::~Docktor()
    24.  
      {
    25.  
      }
    26.  
       
    27.  
      void Docktor::popTask()
    28.  
      {
    29.  
      //获取任务
    30.  
      QString taskData = m_redis->lpop(KEYTASK);
    31.  
      if (taskData.compare("nil", Qt::CaseInsensitive) == 0 || taskData.isEmpty())
    32.  
      {
    33.  
      //qDebug() << QString("wait..............................");
    34.  
      return;
    35.  
      }
    36.  
      //处理任务
    37.  
      pushResult(taskData);
    38.  
      }
    39.  
       
    40.  
      void Docktor::pushResult(const QString &task)
    41.  
      {
    42.  
      QStringList taskDatas = task.split(",");
    43.  
      QString state = taskDatas.at(2);
    44.  
      taskDatas.removeLast();
    45.  
      taskDatas.append(QStringLiteral("状态:看病"));
    46.  
      //push处理结果
    47.  
      qDebug() <<"======================================================== " << taskDatas.join(",");
    48.  
      qDebug() << "thread id :" << int(QThread::currentThreadId());
    49.  
      qint64 ret = m_redis->rpush(KEYRESULT, taskDatas.join(","));
    50.  
      }
    51.  
       
    main.cpp
    1.  
      #include <QtCore/QCoreApplication>
    2.  
      #include <QDebug>
    3.  
      #include <QThread>
    4.  
      #include "docktor.h"
    5.  
       
    6.  
      int main(int argc, char *argv[])
    7.  
      {
    8.  
      QCoreApplication a(argc, argv);
    9.  
      qDebug() << QString("main thread id = : %1").arg(int(QThread::currentThreadId()));
    10.  
       
    11.  
      QThread docktorThread;
    12.  
      Docktor docktor;
    13.  
      docktor.moveToThread(&docktorThread);
    14.  
      docktorThread.start();
    15.  
      return a.exec();
    16.  
      }

    /////////////////截图/////////////

  • 相关阅读:
    【leetcode】236. 二叉树的最近公共祖先
    【leetcode】230. 二叉搜索树中第K小的元素
    【leetcode】309. 最佳买卖股票时机含冷冻期
    【leetcode】306. 累加数
    【leetcode】304. 二维区域和检索
    spring-framework源码编译及导入
    Java8-函数式接口理解及测试
    Mac编译RocketMQ 4.1.0
    首记
    JS表单验证
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/9896649.html
Copyright © 2020-2023  润新知