ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PYSIDE6 멀티스레딩
    PYTHON(파이썬)/PYSIDE6(GUI) 2024. 10. 24. 06:51
    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
Designed by Tistory.