第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Python 從后臺(tái)線程在主線程上運(yùn)行函數(shù)

Python 從后臺(tái)線程在主線程上運(yùn)行函數(shù)

達(dá)令說(shuō) 2023-10-06 19:23:04
這樣創(chuàng)建了一個(gè)后臺(tái)線程 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 的東西,所以這不好。如何在主線程中調(diào)用 self.door_close ?
查看完整描述

3 回答

?
呼如林

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超3個(gè)贊

需要記住的一件事是,每個(gè)線程都是單個(gè)代碼流的順序執(zhí)行,從線程啟動(dòng)的函數(shù)開始。簡(jiǎn)單地在現(xiàn)有線程上運(yùn)行某些內(nèi)容沒(méi)有多大意義,因?yàn)樵摼€程已經(jīng)在執(zhí)行某些內(nèi)容,并且這樣做會(huì)破壞它的當(dāng)前流程。


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


例如你的主線程可能看起來(lái)像這樣


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()

在其他線程中,您可以通過(guò)簡(jiǎn)單地將函數(shù)添加到隊(duì)列中來(lái)要求主線程運(yùn)行該函數(shù)tasks:


 def listenReply(self):

    while self.SOCK_LISTENING:

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

        if fromNodeRED=="closeDoor":

            tasks.put(door_closed)


查看完整回答
反對(duì) 回復(fù) 2023-10-06
?
狐的傳說(shuō)

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊

我自己使用 PyQt 的信號(hào)和插槽解決了這個(gè)問(wèn)題。


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

對(duì)我來(lái)說(shuō)效果很好。


查看完整回答
反對(duì) 回復(fù) 2023-10-06
?
有只小跳蛙

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊

threading.Event()每當(dāng)您收到來(lái)自 的“closeDoor”消息時(shí),您都可以使用和設(shè)置它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() 


查看完整回答
反對(duì) 回復(fù) 2023-10-06
  • 3 回答
  • 0 關(guān)注
  • 198 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)