[PyQt5] signal과 slot을 이용한 멀티스레드 작업

김유상·2022년 12월 22일
0
post-custom-banner

PyQt에서는 GUI를 제어하는 기능들을 제공하는데 다른 스레드와 상호 작용하게 될 경우, main에서 만 GUI를 변경할 수 있기 때문에 제어 흐름을 관리하기 굉장히 어렵다. 그래서 pyqt에서도 제공하고 있는 기능이 바로 signal과 slot이다. signal은 시스템 외부에서 시스템으로 event를 전달하는 것이고 slot은 event를 처리하는 로직을 뜻한다. 여기서 signal을 사용자가 직접 정의하면 원하는 제어 흐름에서 event를 발생시킬 수 있다.

아래 코드를 보면 Main에서 model_check_signal = QtCore.pyqtSignal()을 통해 직접 시그널 변수를 선언해주고 있다. 이 변수를 통해 event를 발생 시키고 signal을 전달할 수 있다. 그러면 slot인 model_slot을 호출하면서 main 스레드로 하여금 직접적인 GUI 변경을 수행할 수 있다.

class ModelProcess():
    def __init__(self):
        self.run_thread_init()
        
    def run_thread_init(self):
        self.run_thread = Thread(target=self.run)
        
class Main(QMainWindow):
    model_check_signal = QtCore.pyqtSignal()
    def __init__(self):
        self.model_check_signal.connect(self.model_slot)
        
    def fun1(self):
        self.model_process.image_path = folder_path
        self.model_process.run_thread_init()
        self.model_process.run_thread.start()

        def check_model():
            while self.model_process.run_thread.is_alive():
                time.sleep(0.1)
            self.model_check_signal.emit()

        model_checker = Thread(target=check_model)
        model_checker.start()

    def model_slot(self):
        self.updateTest(WIDTH_SCALE_OFFSET, self.test, self.folder_dict, self.result_widget, self.veri_widget)
        self.stacked_widget.setCurrentWidget(self.result_widget)
profile
continuous programming
post-custom-banner

0개의 댓글