遇到的问题
想要通过后台的qthread 的线程,当其完成一些操作后,能够触发一些函数,执行一些另外的操作。
传统的触发方式如下:
class WorkThread(QThread):
trigger = pyqtSignal()
def __int__(self):
super(WorkThread, self).__init__()
def run(self):
#这一部分就可以写入你想要执行的代码就好
# print('开始执行了run')
# for i in range(2000000000):
# pass
#
# # 循环完毕后发出信号
# print('1线程运行完了')
self.trigger.emit()
通过设定的qthread emit 进行触发的结果。
通过主函数调用的写法
def EquipmentCStopFunction(self):
print('执行C物体停止功能开始')
self.workThread=WorkThread() #实例化一个线程对象
self.workThread.trigger.connect(self.timeStop1) #链接你执行完这个线程之后的想要触发的 函数的名字
self.workThread.start() #这个就是启动你的想要执行额线程,注意这个是start 而不是run
self.workThread1 = WorkThread1() #实例化一个线程对象
self.workThread1.trigger.connect(self.timeStop2)#链接你执行完这个线程之后的想要触发的 函数的名字
self.workThread1.start() #这个就是启动你的想要执行额线程,注意这个是start 而不是run
结论
上面使用场景, 对于不传递参数是可用的,但是如果传递参数,该如何写???
如何传递参数
出现的问题
如果你直接写
self.trigger.emit(“hello i am done”)
这样是会出现报错的,因此,经过我不断的查询资料。
解决方法
在初始化trigger的时候,需要给定触发传输的类型。
示例代码
trigger=QtCore.pyqtSignal(str)
def __init__(self):
super().__init__()
self.flagtcpforepics = True
def run(self):
# 通过触发不同的函数的去调用主线程中的函数,这个时候就是属于来自epics 的自动控制
while True:
if self.flagtcpforepics:
print('in tcp receive part')
self.filestr = "hhaha "
self.trigger.emit(self.filestr)
主函数部分
self.tcp_epics_thread = tcp_receiving_thread()
self.tcp_epics_thread.trigger.connect(self.epics_autoprocess)
def epics_autoprocess(self,msg):
print('get the action in main',msg)
总结
本文给出了pyqt的qthread 的使用方法和如何通过emit 传递参数