亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python 從后臺線程在主線程上運行函數

Python 從后臺線程在主線程上運行函數

達令說 2023-10-06 19:23:04
這樣創建了一個后臺線程 def listenReply(self):        while self.SOCK_LISTENING:            fromNodeRED = self.nodeRED_sock.recv(1024).decode()            if fromNodeRED=="closeDoor":                self.door_closed() ...    self.listenThread = Thread(target=self.listenReply, daemon=True)    self.SOCK_LISTENING = True    self.listenThread.start()但是 self.door_close() 有一些 UI 的東西,所以這不好。如何在主線程中調用 self.door_close ?
查看完整描述

3 回答

?
呼如林

TA貢獻1798條經驗 獲得超3個贊

需要記住的一件事是,每個線程都是單個代碼流的順序執行,從線程啟動的函數開始。簡單地在現有線程上運行某些內容沒有多大意義,因為該線程已經在執行某些內容,并且這樣做會破壞它的當前流程。


然而,線程之間的通信非常容易,并且可以實現線程的代碼,使其僅從其他線程接收函數/事件來告訴它要做什么。這通常稱為事件循環。


例如你的主線程可能看起來像這樣


from queue import Queue


tasks = Queue()


def event_loop():

   while True:

       next_task = tasks.get()

       print('Executing function {} on main thread'.format(next_task))

       next_task()

在其他線程中,您可以通過簡單地將函數添加到隊列中來要求主線程運行該函數tasks:


 def listenReply(self):

    while self.SOCK_LISTENING:

        fromNodeRED = self.nodeRED_sock.recv(1024).decode()

        if fromNodeRED=="closeDoor":

            tasks.put(door_closed)


查看完整回答
反對 回復 2023-10-06
?
狐的傳說

TA貢獻1804條經驗 獲得超3個贊

我自己使用 PyQt 的信號和插槽解決了這個問題。


class App(QWidget):


    socketSignal = QtCore.pyqtSignal(object) #must be defined in class level


    # BG THREAD

    def listenReply(self):

        while self.SOCK_LISTENING:

            fromNodeRED = self.nodeRED_sock.recv(1024).decode()

            print(fromNodeRED)

            self.socketSignal.emit(fromNodeRED)

....主線程 init 中的某處:


    self.socketSignal.connect(self.executeOnMain)

    self.listenThread = Thread(target=self.listenReply, daemon=True)

    self.SOCK_LISTENING = True

    self.listenThread.start()

       

....


def executeOnMain(self, data):

     if data=="closeDoor":

            self.door_closed() # a method that changes the UI

對我來說效果很好。


查看完整回答
反對 回復 2023-10-06
?
有只小跳蛙

TA貢獻1824條經驗 獲得超8個贊

threading.Event()每當您收到來自 的“closeDoor”消息時,您都可以使用和設置它recv。


例如:


g_should_close_door = threading.Event()


def listenReply(self):

    while self.SOCK_LISTENING:

        fromNodeRED = self.nodeRED_sock.recv(1024).decode()

        if fromNodeRED=="closeDoor":

            g_should_close_door.set()


    ...


    self.listenThread = Thread(target=self.listenReply, daemon=True)

    self.SOCK_LISTENING = True

    self.listenThread.start()


    if g_should_close_door.is_set():

        door_closed() 

        g_should_close_door.clear() 


查看完整回答
反對 回復 2023-10-06
  • 3 回答
  • 0 關注
  • 188 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號