pyqt5-qthread 實現emit觸發另一個函數

遇到的問題

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章