본문 바로가기
PYTHON(파이썬)/PYSIDE6(GUI)

PYSIDE6 멀티스레딩

by eplus 2024. 10. 24.
728x90
반응형

멀티스레딩은 애플리케이션의 성능을 향상시키고, 동시에 여러 작업을 수행할 수 있게 합니다. 이 장에서는 PySide6를 사용하여 멀티스레딩을 구현하는 방법을 알아보겠습니다.

 

#### QThread

`QThread` 클래스는 Qt에서 스레드를 관리하는 기본 클래스입니다. 이를 사용하여 새로운 스레드를 생성하고 실행할 수 있습니다.

 

**기본 QThread 사용 예제**

```python

import sys

from PySide6.QtCore import QThread, Signal, Slot

from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QTextEdit

 

class WorkerThread(QThread):

    result_ready = Signal(str)

 

    def run(self):

        for i in range(5):

            self.sleep(1)  # 1초 대기

            self.result_ready.emit(f"Count: {i+1}")

 

class MainWindow(QMainWindow):

    def __init__(self):

        super(MainWindow, self).__init__()

        self.setWindowTitle("QThread Example")

 

        self.thread = WorkerThread()

        self.thread.result_ready.connect(self.update_text)

 

        self.text_edit = QTextEdit(self)

        self.start_button = QPushButton("Start", self)

        self.start_button.clicked.connect(self.start_thread)

 

        layout = QVBoxLayout()

        layout.addWidget(self.text_edit)

        layout.addWidget(self.start_button)

 

        container = QWidget()

        container.setLayout(layout)

        self.setCentralWidget(container)

 

    @Slot(str)

    def update_text(self, text):

        self.text_edit.append(text)

 

    def start_thread(self):

        self.thread.start()

 

app = QApplication(sys.argv)

window = MainWindow()

window.show()

app.exec()

```

이 예제에서는 `QThread`를 상속받는 `WorkerThread` 클래스를 생성하여 백그라운드 작업을 수행합니다. 스레드에서 작업이 완료될 때마다 `result_ready` 시그널을 방출하고, 메인 윈도우는 이 시그널을 수신하여 텍스트를 업데이트합니다.

 

#### QRunnable QThreadPool

`QRunnable` `QThreadPool`을 사용하여 스레드 풀을 관리하고, 여러 작업을 동시에 실행할 수 있습니다.

 

**QRunnable QThreadPool 사용 예제**

```python

import sys

from PySide6.QtCore import QRunnable, QThreadPool, QTimer, Slot

from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QTextEdit

 

class Worker(QRunnable):

    def __init__(self):

        super(Worker, self).__init__()

 

    @Slot()

    def run(self):

        for i in range(5):

            QThread.sleep(1)

            print(f"Count: {i+1}")

 

class MainWindow(QMainWindow):

    def __init__(self):

        super(MainWindow, self).__init__()

        self.setWindowTitle("QThreadPool Example")

 

        self.thread_pool = QThreadPool()

 

        self.text_edit = QTextEdit(self)

        self.start_button = QPushButton("Start", self)

        self.start_button.clicked.connect(self.start_worker)

 

        layout = QVBoxLayout()

        layout.addWidget(self.text_edit)

        layout.addWidget(self.start_button)

 

        container = QWidget()

        container.setLayout(layout)

        self.setCentralWidget(container)

 

    def start_worker(self):

        worker = Worker()

        self.thread_pool.start(worker)

 

app = QApplication(sys.argv)

window = MainWindow()

window.show()

app.exec()

```

이 예제에서는 `QRunnable`을 상속받는 `Worker` 클래스를 생성하여 작업을 수행합니다. `QThreadPool`을 사용하여 여러 작업을 동시에 실행할 수 있습니다.

 

#### QTimer

`QTimer`는 일정한 간격으로 작업을 수행할 수 있게 합니다. 이를 사용하여 주기적으로 작업을 실행할 수 있습니다.

 

**QTimer 사용 예제**

```python

import sys

from PySide6.QtCore import QTimer

from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QTextEdit

 

class MainWindow(QMainWindow):

    def __init__(self):

        super(MainWindow, self).__init__()

        self.setWindowTitle("QTimer Example")

 

        self.text_edit = QTextEdit(self)

        self.start_button = QPushButton("Start Timer", self)

        self.start_button.clicked.connect(self.start_timer)

 

        layout = QVBoxLayout()

        layout.addWidget(self.text_edit)

        layout.addWidget(self.start_button)

 

        container = QWidget()

        container.setLayout(layout)

        self.setCentralWidget(container)

 

        self.timer = QTimer()

        self.timer.timeout.connect(self.update_text)

 

    def start_timer(self):

        self.timer.start(1000)  # 1초 간격으로 타이머 시작

 

    def update_text(self):

        self.text_edit.append("Timer tick")

 

app = QApplication(sys.argv)

window = MainWindow()

window.show()

app.exec()

```

이 예제에서는 `QTimer`를 사용하여 1초 간격으로 "Timer tick" 메시지를 `QTextEdit`에 추가합니다.

 

### 결론

이 장에서는 PySide6를 사용하여 멀티스레딩을 구현하는 방법을 알아보았습니다. `QThread`를 사용하여 기본 스레드를 생성하고 실행하는 방법, `QRunnable` `QThreadPool`을 사용하여 스레드 풀을 관리하는 방법, `QTimer`를 사용하여 주기적으로 작업을 수행하는 방법을 다루었습니다. 다음 장에서는 데이터 시각화를 위한 Matplotlib 통합을 알아보겠습니다.

 

728x90