-
PYSIDE6 멀티스레딩PYTHON(파이썬)/PYSIDE6(GUI) 2024. 10. 24. 06:51728x90반응형
멀티스레딩은 애플리케이션의 성능을 향상시키고, 동시에 여러 작업을 수행할 수 있게 합니다. 이 장에서는 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'PYTHON(파이썬) > PYSIDE6(GUI)' 카테고리의 다른 글
PYSIDE6 배포 (0) 2024.10.25 PYSIDE6 Matplotlib을 사용한 데이터 시각화 (0) 2024.10.25 PYSIDE6 데이터베이스 작업 (0) 2024.10.24 PYSIDE6 고급 모델 뷰 프로그래밍 (2) 2024.10.24 PYSIDE6 QT의 모델 뷰 아키텍처 (3) 2024.10.24