想要實作執行緒的阻塞與喚醒。使用PySide2的代碼如下,執行緒休眠時,為什么主界面也陷入了無回應的狀態。同樣的寫法,在PyQt5中,可以正常執行休眠和喚醒。PySide與PyQt在QWaitconditon&QMutext用法上有什么不同嗎?要怎么改才能實作圖一的效果呢?拜托大佬幫幫我

圖一:想要的效果(PyQt5的效果):

圖二:PySide2代碼執行的結果:

```python
from PySide2.QtCore import QThread, QWaitCondition, QMutex, Signal
from PySide2.QtWidgets import QWidget, QVBoxLayout, QPushButton, QProgressBar
class Thread(QThread):
valueChange = Signal(int)
def __init__(self, *args, **kwargs):
super(Thread, self).__init__(*args, **kwargs)
self._isPause = False
self._value = 0
self.cond = QWaitCondition()
self.mutex = QMutex()
def pause(self):
print("執行緒休眠")
self._isPause = True
def resume(self):
print("執行緒啟動")
self._isPause = False
self.cond.wakeAll()
def run(self):
while 1:
self.mutex.lock()
if self._isPause:
self.cond.wait(self.mutex)
if self._value > 100:
self._value = 0
self._value += 1
self.valueChange.emit(self._value)
self.msleep(100)
self.mutex.unlock()
class Window(QWidget):
def __init__(self, *args, **kwargs):
super(Window, self).__init__(*args, **kwargs)
layout = QVBoxLayout(self)
self.progressBar = QProgressBar(self)
layout.addWidget(self.progressBar)
layout.addWidget(QPushButton('休眠', self, clicked=self.doWait))
layout.addWidget(QPushButton('喚醒', self, clicked=self.doWake))
self.t = Thread(self)
self.t.valueChange.connect(self.progressBar.setValue)
self.t.start()
def doWait(self):
self.t.pause()
def doWake(self):
self.t.resume()
if __name__ == '__main__':
import sys
from PySide2.QtWidgets import QApplication
app = QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())
```
uj5u.com熱心網友回復:
PySide2.QtCore.QWaitCondition.wait(lockedMutex[, deadline=QDeadlineTimer(QDeadlineTimer.Forever)]),當我給定deadline為3000時,代碼的表現又正常了---等待3000ms后喚醒執行緒。檔案中說,使用默認的forever時,等待將永不超時,但問什么程式會直接未回應啊
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/19798.html
上一篇:pytorch中nn. Upsample中有align_corners,在keras中的UpSampling2D怎么定義吶
