QThread & Custom Signal 예시
반응형

이번에는 QThread 사용법이다.

 

다른 언어에서도 다 사용하듯 1개의 쓰레드로 모든 기능을 처리한다는 것은 불가능에 가깝다.

 

특히나 UI가 있다면 더더욱.. (프리징현상 어쩔꺼야...)

 

그리하여 이번엔 QTthread이다.

 

정말 간단한 예제이며

 

QT에서는 QThread말고 QRunnable 등 다른 여러가지 Thread 사용법들이 있다..

 

차차 하나씩 알아보고 이번엔 간단한 QThread만 알아보도록 하자

 

from PySide6.QtCore import *
from PySide6.QtWidgets import *

import sys
import time

# 내 돈
balance = 100

# 돈을 1씩 계속 없애는 QThread
class Balance_decrease(QThread):
    # Custom Signal 생성
    UpdateBalance = Signal()

    # QThread의 주 함수
    def run(self):
        # 내 돈을 Global에서 가져온다.
        global balance
        # 무한 루프
        while True:
            # 내 돈을 1원씩 계속 없앤다
            balance -= 1
            # 없애고 난 돈을 Emit(이벤트 발생)한다.
            self.UpdateBalance.emit()
            # 1초 대기
            time.sleep(1)


# 메인 윈도우
class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        # 내 돈 표출할 레이블 하나 추가
        self.lbl = QLabel(str(balance))

        # 쓰레드 호출 버튼
        self.btn1 = QPushButton("FIRE")
        # 버튼 선택 시 함수 연결
        self.btn1.clicked.connect(self.btn1_clicked)

        # UI 설정
        self.layout = QHBoxLayout()
        self.layout.addWidget(self.lbl)
        self.layout.addWidget(self.btn1)

        self.setLayout(self.layout)

    def btn1_clicked(self):
        try:
            # 쓰레드 클래스 선언
            x = Balance_decrease(self)
            # 내 돈에 대한 이벤트 호출 시 함수 연결
            x.UpdateBalance.connect(self.lbl_update)
            # 쓰레드 클래스 시작!
            x.start()

        except KeyboardInterrupt:
            print("KeyboardInterrupt")

    def lbl_update(self):
        # 내 돈 표출
        self.lbl.setText(str(balance))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    app.exec()

 

그렇게까지 어려운 코드가 아니라 다들 이해할 거라 생각함..

 

주로 봐야할 부분은 Signal 선언하고 emit하는 부분과 connect로 연결하는 부분이다.

(PySide6은 Signal, PyQT5는 pyqtSignal로 선언)

 

이부분만 보면 Custom Event를 알 수 있을테고..

 

QTthread는 클래스 생성 시 QThread를 상속받고 run 함수에 특정 기능을 넣는다 정도 하면 될 것 같다.

반응형