공부/Python
4. [Python] QWaitCondition
유저라인
2019. 12. 17. 18:21
728x90
반응형
import sys
from PyQt5.QtCore import QThread, pyqtSignal, QMutex, pyqtSlot, QWaitCondition
from PyQt5.QtWidgets import QWidget, QTextEdit, QApplication, QPushButton, QBoxLayout, QProgressBar
from PyQt5.QtCore import Qt
from PyQt5 import QtCore
class test_thread(QThread):
change_value = pyqtSignal(str)
def __init__(self):
super().__init__()
self.cond = QWaitCondition()
self.mutex = QMutex()
self.cnt = 0
self.pause = False
def __del__(self):
self.wait()
def run(self):
while True:
self.mutex.lock()
self.cnt += 1
self.change_value.emit('time (secs):{}'.format(self.cnt))
self.msleep(1000)
if self.pause:
print("pause1")
self.cond.wait(self.mutex)
print("pause1")
self.mutex.unlock()
def set_status(self):
self.pause = False
self.cond.wakeAll()
def pause_status(self):
self.pause = True
class MyMain(QWidget):
def __init__(self):
super().__init__()
self.Edit1 = QTextEdit(self)
self.pgsb = QProgressBar()
self.bt1 = QPushButton("증가")
self.bt2 = QPushButton("WakeAll")
self.bt3 = QPushButton("Pause")
self.th = test_thread()
# self.th.start()
self.Edit1.setText("test")
self.setGeometry(1000, 50, 300, 500)
self.bt1.clicked.connect(self.slot_clicked_bt1)
self.bt2.clicked.connect(self.slot_clicked_bt2)
self.bt3.clicked.connect(self.slot_clicked_bt3)
# self.th.change_value.connect(self.pgsb.setValue)
self.th.change_value.connect(self.slot_Edit)
form_lbx = QBoxLayout(QBoxLayout.TopToBottom, self)
self.setLayout(form_lbx)
form_lbx.addWidget(self.Edit1)
form_lbx.addWidget(self.pgsb)
form_lbx.addWidget(self.bt1)
form_lbx.addWidget(self.bt2)
form_lbx.addWidget(self.bt3)
def slot_clicked_bt1(self):
self.th.start()
print("clicked1")
def slot_clicked_bt2(self):
self.th.set_status()
print("checked2")
def slot_clicked_bt3(self):
self.th.pause_status()
print("checked3")
@pyqtSlot(str)
def slot_Edit(self, msg):
self.Edit1.append(msg)
if __name__ == "__main__":
app = QApplication(sys.argv)
form = MyMain()
form.show()
app.exec_()
증가 버튼을 눌러
self.th.start() 를 시작하면 1초씩 증가하면서 TextEdit에 기록합니다.
그러면 while 문으로 진입하게 됩니다.
여기서 Pause 버튼을 누르면 QWaitCondition 의 기능을 알수 있습니다.
Pause 버튼을 누르는 순간 wait 상태가 되고
다시 WakeAll을 버튼을 눌러서
wakeAll() 을 사용하여 활성화 시킵니다.
그러면 mutex에 지정된 lock과 unlock 사이에서 시작하게 됩니다.
다시 1초씩 증가하게 됩니다.
728x90
반응형