版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liulihuo_gyh/article/details/78425763
类似BS模式,客户端发送任务请求给服务端,服务端将处理结果返回给客户端。 redis负责消息的存储和转发。
仿真病人挂号看病,Patient进程进行挂号,Doctor进程进行看病 ,程序代码如下:
Patient
Patient.h:
-
-
- class QRedis;
-
- class Patient : public QObject
- {
- Q_OBJECT
-
- public:
- Patient(QObject *parent = nullptr);
- ~Patient();
-
- public slots:
- void pushTask(); //push任务
-
- private:
- void popResult(); //pop结果
- QRedis * m_redis;
- };
-
-
-
-
-
-
- static const QString KEYTASK = "MARKTASK";
- static const QString KEYRESULT = "MARKRESULT";
-
- Patient::Patient(QObject *parent)
- : QObject(parent)
- {
- //初始化通道
- m_redis = new QRedis(this);
- m_redis->connectHost( "127.0.0.1", 6379);
- m_redis->auth( "1234");
-
- qDebug() << "client thread id :" << int(QThread::currentThreadId());
-
- //轮询任务
- QTimer * timer = new QTimer(this);
- connect(timer, &QTimer::timeout, this, &Patient::popResult);
- timer->start( 20);
-
- m_redis->del(KEYRESULT);
- m_redis->del(KEYTASK);
- pushTask();
- }
-
- Patient::~Patient()
- {
- }
-
- void Patient::pushTask()
- {
- static int i = 0;
- QString task = QStringLiteral( "%1号,姓名:%2,状态:%3").arg(++i).arg(QStringLiteral("病人%1").arg(i)).arg(QStringLiteral("挂号"));
- qDebug() << "========================================================\n\n"<< task;
- qDebug() << "thread id :" << int(QThread::currentThreadId());
- qint64 ret = m_redis->rpush(KEYTASK, task);
- }
-
- void Patient::popResult()
- {
- QString state;
- QString taskData = m_redis->lpop(KEYRESULT);
- if (taskData.compare("nil", Qt::CaseInsensitive) == 0 || taskData.isEmpty())
- {
- return;
- }
- QEventLoop loop;
- QTimer::singleShot( 5000, &loop, &QEventLoop::quit);
- loop.exec();
- pushTask();
- }
-
-
-
-
-
-
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
-
- qDebug() << QString( "main thread id = : %1").arg(int(QThread::currentThreadId()));
-
- QThread patientThread;
- Patient patient;
- patient.moveToThread(&patientThread);
- patientThread.start();
- return a.exec();
- }
Docktor.h
-
-
-
-
- class QRedis;
-
- class Docktor : public QObject
- {
- Q_OBJECT
-
- public:
- Docktor(QObject *parent = nullptr);
- ~Docktor();
-
- public slots:
- void popTask(); //pop任务
-
- private:
- void pushResult(const QString &task); //push结果
-
- QRedis * m_redis;
- };
-
-
-
-
-
-
- static const QString KEYTASK = "MARKTASK";
- static const QString KEYRESULT = "MARKRESULT";
-
- Docktor::Docktor(QObject *parent)
- : QObject(parent)
- {
- //初始化通道
- m_redis = new QRedis(this);
- m_redis->connectHost( "127.0.0.1", 6379);
- m_redis->auth( "1234");
-
- QTimer * timer = new QTimer(this);
- connect(timer, &QTimer::timeout, this, &Docktor::popTask);
- timer->start( 20);
- }
-
- Docktor::~Docktor()
- {
- }
-
- void Docktor::popTask()
- {
- //获取任务
- QString taskData = m_redis->lpop(KEYTASK);
- if (taskData.compare("nil", Qt::CaseInsensitive) == 0 || taskData.isEmpty())
- {
- //qDebug() << QString("wait..............................");
- return;
- }
- //处理任务
- pushResult(taskData);
- }
-
- void Docktor::pushResult(const QString &task)
- {
- QStringList taskDatas = task.split( ",");
- QString state = taskDatas.at( 2);
- taskDatas.removeLast();
- taskDatas.append(QStringLiteral( "状态:看病"));
- //push处理结果
- qDebug() << "========================================================\n\n" << taskDatas.join(",");
- qDebug() << "thread id :" << int(QThread::currentThreadId());
- qint64 ret = m_redis->rpush(KEYRESULT, taskDatas.join( ","));
- }
-
-
-
-
-
-
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- qDebug() << QString( "main thread id = : %1").arg(int(QThread::currentThreadId()));
-
- QThread docktorThread;
- Docktor docktor;
- docktor.moveToThread(&docktorThread);
- docktorThread.start();
- return a.exec();
- }