用事件队列解决GUI的操作顺序问题(Qt中处理方法)

- class ItemsOpsBase
- {
- public:
- virtual void doOperation(ConnectionView *view) = ;
- virtual ~ItemsOpsBase() = default;
- };
- class DeleteItem : public ItemsOpsBase
- {
- public:
- DeleteItem(qintptr target,qint32 connectionIndex)
- :ItemsOpsBase(), _target(target),_connectionIndex(connectionIndex){ }
- void doOperation(ConnectionView *view)override;
- ~DeleteItem() = default;
- private:
- qintptr _target;
- qint32 _connectionIndex;
- };
- class UpdatePulse :public ItemsOpsBase
- {
- public:
- UpdatePulse(qintptr descriptor,qint32 currentTime)
- :ItemsOpsBase(), _descriptor(descriptor),_currentTime(currentTime){ }
- void doOperation(ConnectionView *view)override;
- ~UpdatePulse() = default;
- private:
- qintptr _descriptor;
- qint32 _currentTime;
- };
- class UpdateRemark : public ItemsOpsBase
- {
- public:
- UpdateRemark(qintptr descriptor, const QString &remark)
- : ItemsOpsBase(),_remark(remark),_descriptor(descriptor){ }
- void doOperation(ConnectionView *view)override;
- ~UpdateRemark() = default;
- private:
- QString _remark;
- qintptr _descriptor;
- };
- class TestConnection : public ItemsOpsBase
- {
- public:
- void doOperation(ConnectionView *view)override;
- };
- class TestConnectionProducer : public QThread
- {
- public:
- void run()override;
- };
- class CopySelectedItemInformProducer : public QThread
- {
- public:
- void run()override;
- };
- class DisconnectTargetsProducer : public QThread
- {
- public:
- void run()override;
- };
- class DeleteItemProducer :public QThread
- {
- public:
- DeleteItemProducer(qintptr target, qint32 connectionIndex)
- : QThread(),_target(target),_connectionIndex(connectionIndex) { }
- void run()override;
- private:
- qintptr _target;
- qint32 _connectionIndex;
- };
- class UpdatePulseProducer :public QThread
- {
- public:
- UpdatePulseProducer(qintptr descriptor, qint32 currentTime)
- :QThread(),_descriptor(descriptor),_currentTime(currentTime){ }
- protected:
- void run()override;
- private:
- qintptr _descriptor;
- qint32 _currentTime;
- };
- class UpdateRemarkProducer : public QThread
- {
- public:
- UpdateRemarkProducer(qintptr descriptor, const QString &remark)
- :QThread(),_remark(remark),_descriptor(descriptor){ }
- protected:
- void run()override;
- private:
- QString _remark;
- qintptr _descriptor;
- };
- class ConsumerHelper :public QThread
- {
- public:
- ConsumerHelper(ConnectionView *view)
- :QThread(),_view(view){ }
- ~ConsumerHelper();
- protected:
- void run() override;
- private:
- ConnectionView *_view;
- ConsumerHelper(const ConsumerHelper &other) = delete;
- ConsumerHelper(const ConsumerHelper &&other) = delete;
- ConsumerHelper &operator=(const ConsumerHelper &other) = delete;
- };
- static QQueue<QSharedPointer<ItemsOpsBase>> &opQueue()
- {
- static QQueue<QSharedPointer<ItemsOpsBase>> queue;
- return queue;
- }
- static QSharedPointer<ItemsOpsBase> endOperation;
- static QMutex &opQueueLock()
- {
- static QMutex mutex;
- return mutex;
- }
- static QWaitCondition &opQueueIsAvailable()
- {
- static QWaitCondition flag;
- return flag;
- }
- void DeleteItem::doOperation(ConnectionView *view)
- {
- qRegisterMetaType<qintptr>("qintptr");
- qRegisterMetaType<TcpConnectionHandler *>("TcpConnectionHandler *");
- QMetaObject::invokeMethod(view, "deleteConnection",Qt::QueuedConnection, Q_ARG(qintptr, _target), Q_ARG(qint32, _connectionIndex));
- }
- void DeleteItemProducer::run()
- {
- QSharedPointer<ItemsOpsBase> op = QSharedPointer<ItemsOpsBase>(new DeleteItem(_target,_connectionIndex));
- QMutexLocker locker(&opQueueLock());
- opQueue().enqueue(op);
- opQueueIsAvailable().wakeOne();
- }
- void ConsumerHelper::run()
- {
- forever
- {
- QSharedPointer<ItemsOpsBase> opPointer;
- {
- QMutexLocker locker(&opQueueLock());
- if (opQueue().isEmpty())
- opQueueIsAvailable().wait(&opQueueLock());
- opPointer = opQueue().dequeue();
- if (opPointer == endOperation)
- break;
- }
- {
- if(!opPointer.isNull())
- opPointer->doOperation(_view);
- }
- }
- }
- ConsumerHelper::~ConsumerHelper()
- {
- {
- QMutexLocker locker(&opQueueLock());
- while(!opQueue().isEmpty())
- opQueue().dequeue();
- opQueue().enqueue(endOperation);
- opQueueIsAvailable().wakeOne();
- }
- wait();//注意这里是wait在次线程上的
- }
- DeleteItemProducer *deleteItemProducer = new DeleteItemProducer(target,index);
- connect(deleteItemProducer, &QThread::finished, deleteItemProducer, &QThread::deleteLater);
- deleteItemProducer->start();
用事件队列解决GUI的操作顺序问题(Qt中处理方法)的更多相关文章
- Qt中中文字符 一劳永逸的解决方法
QT中中文字符问题,有没有一劳永逸的解决方法? 目前遇到有以下问题 1.字符串中有中文时,编译提示"常量中含有换行符" 2.在控制台窗口输出中文时无法正常显示,中文全部显示为? 目 ...
- Qt 中 Oracle 数据库 QOCI 驱动问题及解决
Qt 中 Oracle 数据库 QOCI 驱动问题及解决是本文要讲述的问题,用Qt开发Oracle程序时,常会遇到QOCI驱动问题,主要表现为程序运行时出现下面的错误. QOCI driver not ...
- 快速解决Ubuntu/linux 环境下QT生成没有可执行文件(application/x-executable)
快速解决Ubuntu/linux 环境下QT生成没有可执行文件(application/x-executable)(转载) 问题描述 与windows环境下不同,linux选择debug构建时并不 ...
- Windows平台下Qt QOpenGL中glutSolidSphere()方法未定义的解决方法
Windows平台下Qt中glut库的使用 用Qt中的QGLWidget窗体类中是不包括glut工具库的,难怪在myGLWidget(在我的程序中是QGLWidget的派生类)中绘制实心球体是 ...
- 【Qt开发】qt中涉及到空格包含路径的解决办法
qt中涉及到空格路径,qmake是无法正确编译的. 需要在空格路径前面加上$$quote INCLUDEPATH += $$quote(C:/Program Files/MySQL/MySQL Ser ...
- QT中QString与string的转化,解决中文乱码问题
在QT中,使用QString输出到控件进行显示时,经常会出现中文乱码,网上查了一圈,发现大部分都是针对QT4增加4条语句:</span> [cpp] view plain copy QTe ...
- Qt入门(9)——Qt中的线程支持
Qt对线程提供了支持,基本形式有独立于平台的线程类.线程安全方式的事件传递和一个全局Qt库互斥量允许你可以从不同的线程调用Qt方法.警告:所有的GUI类(比如,QWidget和它的子类),操作系统核心 ...
- Qt中调用PolarSSL库(一)
最近一直在学习SSL相关的知识,也是先了解理论相关的知识,主要是SSL相关的基本概念和连接建立过程,主要是基于PolarSSL开源库进行学习.学习完了之后就希望能给有所运用,就想用Qt写一个简单的程序 ...
- Qt中Ui名字空间以及setupUi函数的原理和实现 <转>
用最新的QtCreator选择GUI的应用会产生含有如下文件的工程 下面就简单分析下各部分的功能. .pro文件是供qmake使用的文件,不是本文的重点[不过其实也很简单的],在此不多赘述. 所以呢, ...
随机推荐
- U3D手游《苍穹变》性能优化经验谈
4月11日,由unity公司举办的Unite 2016大会在上海正式举行,在4月12日的案例分享专场会议上,天神互动U3D高级开发工程师康凯以手游<苍穹变>为例讲述了3DMMOARPG游戏 ...
- 指向函数的指针和block
原文网址: http://www.cnblogs.com/cxbblog/p/3841226.html 一:block基础知识 block基础知识 基本概念:block是用来保存一段代码的:^:是bl ...
- 学习makefile与autoconfig笔记,持续更新
main.c #include<stdio.h> #include"chen_print.h" int main(int argc , char * argv ){ c ...
- Vue.js实战
指令 什么是指令 指令,directives,是vue非常常用的功能,在template里. 都是以v-开头 不是自己所为html元素,比如假设指令叫v-abc,没有这种写法,这是组件(compone ...
- 企业级应用,如何实现服务化二(dubbo架构)
这是企业级应用,如何实现服务化系列的第二篇.在上一篇:企业级应用,如何实现服务化一(项目架构演化)中,交代了企业级应用架构的演化过程,和服务治理的方案可以选择:dubbo,或者spring cloud ...
- 【Netty】利用Netty实现心跳检测和重连机制
一.前言 心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制. 我们用到的很多框架都用到了心跳检测,比如服务注册到 Eureka Server 之后会维 ...
- properties 文件注意事项
不要使用""双引号包裹内容 db.validationQuery="select 1"比如上面这种是错误的,下面的是正确的写法 db.validationQue ...
- html Css PC 移动端 公用部分样式代码整理
css常用公用部分样式代码整理: body, html, div, blockquote, img, label, p, h1, h2, h3, h4, h5, h6, pre, ul, ol, li ...
- Codeforces 1143B(思维、技巧)
自己水平太低,不丢人. 结论是最后选取的数后缀一定是若干个9,暴举即可.然而暴举也有暴举的艺术. ll n; ll dfs(ll n) { if (n == 0) return 1; if (n &l ...
- [已读]用Angularjs开发下一代web应用
屯了很久了,貌似是国内出现的第一本讲angularjs的书...上上周看完的时候,angular2都要出来了...angular的双向绑定很赞,因为之前公司后台系统我都用tmodjs做,模板语法什么的 ...