개발 기록
[Python] QThread를 사용한 예제 본문
PySide6에서 별도의 스레드로 작업을 오프로드하려면 QThread를 사용하면 됩니다. 이를 위해 먼저 작업을 수행할 클래스를 만들어 QThread를 서브 클래스로 만든 다음, 필요한 작업을 수행하는 run 메소드를 오버라이드합니다. 다음은 간단한 예제를 통해 별도의 스레드에서 작업을 수행하는 방법을 보여줍니다:
import sys
from time import sleep
from PySide6.QtCore import QThread, Signal
from PySide6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QLabel, QPushButton
class WorkerThread(QThread):
progress = Signal(int)
def run(self):
for i in range(1, 101):
sleep(0.1)
self.progress.emit(i)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Thread Example")
self.central_widget = QWidget()
self.layout = QVBoxLayout()
self.label = QLabel("Progress: 0%")
self.layout.addWidget(self.label)
self.start_button = QPushButton("Start")
self.start_button.clicked.connect(self.start_thread)
self.layout.addWidget(self.start_button)
self.central_widget.setLayout(self.layout)
self.setCentralWidget(self.central_widget)
self.worker_thread = WorkerThread()
self.worker_thread.progress.connect(self.update_progress)
def start_thread(self):
if not self.worker_thread.isRunning():
self.worker_thread.start()
def update_progress(self, value):
self.label.setText(f"Progress: {value}%")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.resize(300, 100)
window.show()
sys.exit(app.exec())
위 예제에서는 WorkerThread 클래스를 생성하여 QThread를 서브 클래스로 만들고, 이 클래스는 0.1초마다 1씩 증가하는 값을 생성합니다. 이 값은 progress 시그널을 통해 전달됩니다. 그런 다음 MainWindow 클래스에서 이 시그널을 처리하여 값을 표시합니다.
이 예제에서는 스레드를 사용하여 MainWindow의 이벤트 루프가 차단되지 않으면서 독립적으로 실행되는 별도의 작업을 수행할 수 있습니다. 이 방식을 사용하면 긴 작업을 수행하는 동안 애플리케이션이 멈추거나 창이 응답하지 않는 상황을 피할 수 있습니다.
----
대부분 기록을 목적으로 작성한 글 입니다.
하지만 누군가에게도 도움이 되기를 바랍니다!