网上关于使用PyQt和ICE实现信息通信的资料较少,通常都是在C++中构建子类继承qt库的UI类和ICE的client类,在启动时在子类中的run方法显示可视化界面。这种方法数据间传递比较复杂,同时PyQt的框架语法和C++版本的QT存在一定区别,所以为了实现这个功能,可以采用生成两个子进程,其中一个进程跑QT界面,一个进程跑ICE的Client客户端,两个进程间通过Queue来进行通信。大体框架如下:

main函数:

from client import Client
from multiprocessing import Process,Queue
from test_ui import Ui_Formdef process1(q_ctos,q_stoc,q_ctos_cancel):app = QApplication(sys.argv)window = Ui_Form(q_ctos,q_stoc,q_ctos_cancel)window.show()app.exec()def process2(q_ctos,q_stoc,q_ctos_cancel):client = Client(q_ctos,q_stoc,q_ctos_cancel)client.main(sys.argv,"config/config.client")if __name__ == '__main__':q_ctos=Queue(maxsize=100)q_stoc=Queue(maxsize=100)q_ctos_cancel=Queue(maxsize=100)p1=Process(target=process1,args=(q_ctos,q_stoc,q_ctos_cancel))p2=Process(target=process2,args=(q_ctos,q_stoc,q_ctos_cancel))p1.start()p2.start()

client端:

class CallbackReceiverI(Demo.CallbackReceiver):def __init__(self,q_stoc):self.orderIndex=Noneself.remain_v=Noneself.q_stoc=q_stocdef callback(self, transactions, current=None):'''返回订单完成信息'''i=transactions.orderIndexcode=transactions.stockCodeside=transactions.orderSideprice=transactions.orderPricev=transactions.orderVolumeremain_volume=transactions.remainVolumetot_v=transactions.totalVolumeself.remain_v=remain_volumeself.q_stoc.put([i,code,side,price,v,remain_volume,tot_v])def callindex(self, transactions, current=None):'''返回订单编号'''i=transactions.orderIndexcode=transactions.stockCodeside=transactions.orderSideprice=transactions.orderPricev=transactions.orderVolumeremain_volume=transactions.remainVolumetot_v=transactions.totalVolumeself.orderIndex=iself.q_stoc.put([i,code,side,price,v,remain_volume,tot_v])def callCancel(self, c, current=None):'''返回撤单信息'''if c.tradeBuyIndex==0:# sellprint(f'撤单成功, 成交编号#{c.tradeIndex}, side={c.tradeSide}, 原始编号#{c.tradeSellIndex}, price={c.tradePrice}, volume={c.tradeVolume}')elif c.tradeSellIndex==0:# buyprint(f'撤单成功, 成交编号#{c.tradeIndex}, side={c.tradeSide}, 原始编号#{c.tradeBuyIndex}, price={c.tradePrice}, volume={c.tradeVolume}')class Client(Ice.Application):def __init__(self,q_ctos,q_stoc,q_ctos_cancel):Ice.Application.__init__(self, Ice.Application.NoSignalHandling)self.q_ctos=q_ctosself.q_stoc=q_stocself.q_ctos_cancel=q_ctos_canceldef run(self, args):sender = Demo.CallbackSenderPrx.checkedCast(self.communicator().propertyToProxy('CallbackSender.Proxy').ice_twoway().ice_timeout(-1).ice_secure(False))if not sender:print(self.appName() + ": invalid proxy")return 1adapter = self.communicator().createObjectAdapter("Callback.Client")obj=CallbackReceiverI(self.q_stoc)adapter.add(obj, self.communicator().stringToIdentity("callbackReceiver"))adapter.activate()receiver = Demo.CallbackReceiverPrx.uncheckedCast(adapter.createProxy(self.communicator().stringToIdentity("callbackReceiver")))while 1:if not self.q_ctos.empty():input_list=self.q_ctos.get()code = input_list[0]side = input_list[1]price = input_list[2]volume = input_list[3]order = Demo.Order('514', code, side, price, volume)t1 = threading.Thread(target=sender.initiateCallback, args=(receiver, order))t1.start()else:if not self.q_ctos_cancel.empty():while not self.q_ctos_cancel.empty():cancelorder=self.q_ctos_cancel.get()cs=Demo.CancelSignal(int(cancelorder[0]), cancelorder[1], cancelorder[2], cancelorder[3])t2=threading.Thread(target=sender.initiateCallback2, args=(receiver, cs))t2.start()t2.join()else:pass

UI端:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QThread,pyqtSignalclass Ui_Form(QtWidgets.QWidget):def __init__(self,q_ctos,q_stoc,q_ctos_cancel):super(Ui_Form,self).__init__()self.q_ctos=q_ctosself.q_stoc=q_stocself.q_ctos_cancel=q_ctos_cancelself.remaindict={}self.q_thread=Worker(self.q_stoc)self.setupUi(self)self.retranslateUi(self)def setupUi(self, Form):Form.setObjectName("Form")Form.resize(640, 600)self.pushButton = QtWidgets.QPushButton(Form)self.pushButton.setGeometry(QtCore.QRect(120, 120, 91, 71))self.pushButton.setObjectName("pushButton")self.pushButton.clicked.connect(self.makeorder1)self.pushButton_2 = QtWidgets.QPushButton(Form)self.pushButton_2.setGeometry(QtCore.QRect(270, 120, 91, 71))self.pushButton_2.setObjectName("pushButton_2")self.pushButton_2.clicked.connect(self.makeorder2)self.pushButton_3 = QtWidgets.QPushButton(Form)self.pushButton_3.setGeometry(QtCore.QRect(420, 120, 91, 71))self.pushButton_3.setObjectName("pushButton_3")self.pushButton_3.clicked.connect(self.makeorder3)self.table=QtWidgets.QTableWidget(Form)self.table.setRowCount(10)self.table.setColumnCount(5)self.table.setGeometry(QtCore.QRect(50, 300, 550, 250))self.table.setObjectName("table")self.table.setHorizontalHeaderLabels(['index', 'code', 'side', 'price', 'remain'])self.table.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)self.table.verticalHeader().setVisible(False)self.table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectItems);self.table.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)self.q_thread.start()self.q_thread._signal.connect(self.printqueue)self.pushButton_4 = QtWidgets.QPushButton(Form)self.pushButton_4.setGeometry(QtCore.QRect(420, 200, 91, 71))self.pushButton_4.setObjectName("pushButton_3")self.pushButton_4.clicked.connect(self.cancelorder)self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "Form"))self.pushButton.setText(_translate("Form", "1500买"))self.pushButton_2.setText(_translate("Form", "1600买"))self.pushButton_3.setText(_translate("Form", "1700买"))self.pushButton_4.setText(_translate("Form", "取消订单"))def makeorder1(self):self.q_ctos.put(['000001','B',1500,1000])def makeorder2(self):self.q_ctos.put(['000001', 'B', 1600, 1000])def makeorder3(self):self.q_ctos.put(['000001', 'B', 1700, 1000])def cancelorder(self):while self.q_ctos.qsize()>0:self.q_ctos.get()print(self.remaindict)for key,value in self.remaindict.items():print([key,value['code'],value['side'],value['remain_v']])self.q_ctos_cancel.put([key,value['code'],value['side'],value['remain_v']])self.remaindict={}self.table.setRowCount(0)self.table.setRowCount(10)def printqueue(self,output):index=output[0]code=output[1]side=output[2]price=output[3]remain_v=output[5]if index not in self.remaindict.keys():self.remaindict[index]={}self.remaindict[index]['code']=codeself.remaindict[index]['side'] = sideself.remaindict[index]['price'] = priceself.remaindict[index]['remain_v']=remain_vfor oindex,key in enumerate(self.remaindict.keys()):newItem = QtWidgets.QTableWidgetItem(str(key))newItem.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)newItem.setTextAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)self.table.setItem(oindex, 0, newItem)for index,val in enumerate(self.remaindict[key].values()):newItem = QtWidgets.QTableWidgetItem(str(val))newItem.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)newItem.setTextAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)self.table.setItem(oindex, index+1, newItem)self.table.viewport().update()class Worker(QThread):_signal = pyqtSignal(list)def __init__(self,q_stoc):super(Worker, self).__init__()self.q_stoc = q_stocdef run(self):while 1:if not self.q_stoc.empty():output = self.q_stoc.get()self._signal.emit(output)

PyQt使用ICE框架实现通信相关推荐

  1. 网狐棋牌框架内核通信设计原理剖析

            关于网狐框架我使用和了解大致有5年多了,也深知里面的一些坑坑洼洼,其他人写的一些关于网狐框架分析的文章,大多都是贴上大量的代码,模块流程大致的解说,都是一些皮毛解说,并没有点出为什么这 ...

  2. Ice框架和简单实践-python

    前言 boss说,你去学一下这个 于是我来了. ICE介绍 摘自百度百科 Internet Communications Engine,或Ice,是ZeroC开发的一个面向对象的中间件平台.它提供了面 ...

  3. 分布式服务框架学习笔记2 常用的分布式服务框架 与 通信框架选择

    传统垂直架构改造的核心就是要对应用进行服务化,服务化改造使用到的核心技术就是分布式服务框架. 分布式服务框架演进 应用从集中式走向分布式 大规模系统架构的设计一般原则就是尽可能地拆分,以达到更好的独立 ...

  4. vue如何配置服务器端跨域_客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解...

    本篇博客主要说明: 前后端框架(本例中是vue和koa)如何发送请求?获取响应? 以及跨域问题如何解决? vue部分: import App from './App.vue' import Axios ...

  5. 架构之占位式插件化框架 --组件通信

    文章目录 Activity通信 通过宿主来加载Plugin Activity 1. 环境准备 2. 加载 3. 启动插件 4. 插件Activity的生命周期 插件内部 Activity 加载 Ser ...

  6. Android--›360全面插件化RePlugin框架交互通信使用概述

    官网的wiki文档, 把RePlugin的接入, 插件的使用, 组件的调用介绍的很清楚. 但是关于宿主和插件的交互,介绍的比较少. 本文主要介绍关于Binder交互方式的使用. 点击直接跳转Binde ...

  7. wepy框架组件通信

    1.组件传值:最常用的组件传值就是给子组件身上自定义属性,子组件内用props去接收 //父组件 <template<child :title="title">& ...

  8. 网络通信应用开发利器!—— ESPlus —— ESFramework通信框架的增强库

    概述 ESPlus 是基于网络通信框架ESFramework通信框架通信框架的增强库.为了更贴近实际应用,加快网络通信系统的开发,ESPlus在ESFramework通信框架原生功能的基础上,进行了再 ...

  9. Ali-Perseus(擎天):统一深度学习分布式通信框架 [弹性人工智能]...

    [作者]  驭策(龚志刚) 笋江(林立翔)蜚廉(王志明) 昀龙(游亮) 近些年来,深度学习在图像识别,自然语言处理等领域快速发展.各种网络模型,需要越来越多的计算力来进行训练.以典型的中等规模的图像分 ...

最新文章

  1. java regexp_java中使用regexp
  2. Javascript基础知识篇(5): 面向对象之链式调用
  3. python文件和目录操作方法大全(含实例)
  4. linux操作系统原理_Linux内核分析-操作系统是如何工作的(二)
  5. ABB RAPID 在 Notepad++ 中语法高亮的实现
  6. tomcat依赖导入步骤_Tomcat长生不老之术——嵌入式
  7. 堆之二项堆(Binominal Heap)
  8. 用实际的软件编程示例解释C#中的装饰器模式
  9. 微信发送模版消息,PHP代码简单案例
  10. POJ 1236 Network of Schools (校园网)
  11. 数据库悲观锁和乐观锁
  12. 联想m7400连接不到计算机,联想m7400打印机怎么连接电脑
  13. 干货|6个职场常用Excel技巧,千万不要错过呦!
  14. 小熊派鸿蒙开发板,小熊派-鸿蒙#183;季开发板入门(一)
  15. java项目远程调用别的项目接口
  16. ubuntu18.04双系统安装教程
  17. 浙大ZOJ 1005 Jugs问题解决
  18. 我为什么要选择traefik2做网关?
  19. 罗密欧与朱丽叶的迷宫问题
  20. 微博应用 php源码,新版微测试应用平台|微博应用|微趣源码,有后台+2套模版

热门文章

  1. Unity物体绕圆运动-轨迹
  2. 微信开发者工具如何调整代码工具的字体大小-mac版
  3. SpringCloud 学习(一)---- 微服务的概念
  4. Windows API——SendInput总结(模拟键盘鼠标动作)
  5. 【转】你是否做了正确的决定?
  6. matlab绘制图形中图像标注
  7. 【题解】4879. 【NOIP2016提高A组集训第11场11.9】少女觉
  8. 城市三维地下管线管理系统 (转载)
  9. 淘宝双十一前夕上线一键排查违禁词和全店商品工具
  10. openstack网络(neutron)模式之GRE的基本原理