반응형
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초씩 증가하게 됩니다.
반응형
'공부 > Python' 카테고리의 다른 글
7. [Python] 자료 구조 - list, tuple, dict (1) | 2019.12.20 |
---|---|
6. [Python] QThread , Thread 의 이해 (0) | 2019.12.19 |
[Python] ** 의 쓰임 (0) | 2019.12.17 |
[Python] Empty suite 에러 해결 (0) | 2019.12.12 |
3. [Python] Qt Designer 기본 소스 (0) | 2019.12.10 |