遇到的問題
想要通過後臺的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 傳遞參數