博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt应用Redis实现消息队列
阅读量:5373 次
发布时间:2019-06-15

本文共 3962 字,大约阅读时间需要 13 分钟。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。 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() <<
    "========================================================\n\n"<< 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() <<
    "========================================================\n\n" << 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.  
    }
/截图/

 

转载于:https://www.cnblogs.com/lvdongjie/p/9896649.html

你可能感兴趣的文章
面向对象
查看>>
lintcode83- Single Number II- midium
查看>>
[工具] Sublime Text 使用指南
查看>>
#10015 灯泡(无向图连通性+二分)
查看>>
Data Structure 基本概念
查看>>
[搬运] 写给 C# 开发人员的函数式编程
查看>>
Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)
查看>>
As-If-Serial 理解
查看>>
洛谷P1005 矩阵取数游戏
查看>>
无线通信基础(一):无线网络演进
查看>>
关于python中带下划线的变量和函数 的意义
查看>>
linux清空日志文件内容 (转)
查看>>
MySQL-EXPLAIN执行计划Extra解释
查看>>
图片点击轮播(三)-----2017-04-05
查看>>
java中new一个对象和对象=null有什么区别
查看>>
字母和数字键的键码值(keyCode)
查看>>
01_1_准备ibatis环境
查看>>
JavaScript中的BOM和DOM
查看>>
spring注入Properties
查看>>
jmeter(五)创建web测试计划
查看>>