본문 바로가기

공부/Python

4. [Python] QWaitCondition

반응형
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