我繼承了一個 GUI 代碼,其結構如下:任何按鈕信號都會觸發一個插槽,這些插槽然后呼叫外部行程來接收資訊并等待該程序完成,然后插槽繼續。問題是,這個外部程序需要 0.5 到 60 秒,在這段時間內 GUI 凍結。我正在努力尋找一種好方法來將此行程呼叫分離到不同的執行緒或 QProcess(這樣我就不會阻塞主事件回圈),然后從同一點回傳并繼續相關插槽(或函式)從該外部緩慢行程接收到的資訊。生成器似乎應該放在這里,但我正在努力弄清楚如何重組代碼以便它可以作業。有什么建議或想法嗎?有沒有一種Qt方式來“屈服”
當前結構的偽代碼:
button1.clicked.connect(slot1)
button2.clicked.connect(slot2)
def slot1():
status = subprocess.run("external proc") # this is blocking
...
...
return
def slot2():
status = subprocess.run("external proc") # this is blocking
...
...
return
uj5u.com熱心網友回復:
這是我在評論中提到的示例代碼:
class MainWindow(QMainWindow, ui_MainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
ui_MainWindow.__init__(self)
self.setupUi(self)
self.button_1.clicked.connect(lambda: self.threaded_wait(1))
self.button_5.clicked.connect(lambda: self.threaded_wait(5))
self.button_10.clicked.connect(lambda: self.threaded_wait(10))
#Start a timer that executes every 0.5 seconds
self.timer = QtCore.QBasicTimer()
self.timer.start(500, self)
#INIT variables
self.results = {}
self.done = False
def timerEvent(self, event):
#Executes every 500msec.
if self.done:
print(self.results)
self.done = False
def threaded_wait(self, time_to_wait):
self.done = False
new_thread = threading.Thread(target=self.actual_wait, args=(time_to_wait,self.sender().objectName()))
new_thread.start()
def actual_wait(self, time_to_wait: int, button_name):
print(f"Button {button_name} Pressed:\nSleeping for {int(time_to_wait)} seconds")
time_passed = 0
for i in range(0, time_to_wait):
print(int( time_to_wait - time_passed))
time.sleep(1)
time_passed = time_passed 1
self.results[button_name] = [1,2,3,4,5]
self.done = True
print("Done!")
uj5u.com熱心網友回復:
您可以使用 QThread。使用 Qthread,您可以通過信號機制將引數傳遞給 mainWindow 中的函式。
這是解釋如何使用 Qthread 的來源:
編輯:
抱歉,對于您問題的第二部分,如果您想在執行其他操作之前等待執行緒完成,您可以使用這樣的標志:
def actual_wait(self, time_to_wait: int):
print(f"Sleeping for {int(time_to_wait)} seconds")
....
self.DONE = True
并在需要的地方檢查 self.DONE 標志。這有點取決于你的意思是等待它完成。我認為如果你使用 QThread,你也可以在執行緒完成時發出一個信號,然后將該信號連接到任何插槽,但我沒有使用 QThread。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/496987.html
標籤:Python 多线程 qt pyqt5 qprocess