상세 컨텐츠

본문 제목

[혼자서 공부해본 파이썬] QThread 사용법 - 메인 Widget 접근 및 변수 접근

ProgramStudy/python

by Ming footprint 2022. 5. 2. 15:11

본문

728x90
반응형

파이썬 QThread 사용

Thread는 하나의 프로세서에서 실행되는 단위라고 말할 수 있습니다.

QThread를 사용하게 된 계기는 UI 프로그램을 만들어서 구동을 해 보았는데,

연산을 처리하는 동안 UI가 멈추는 것을 경험하게 되어서 연산을 하는 동안에도

다른 UI는 동작을 할 수 있도록 별도의 스레드를 구현해야겠다는 생각에서 시작하게 되었습니다.

 

 

QThread 기본 사용법

QThread를 사용하기 위해서는 PyQt5의 QtCore를 import 해야 합니다.

from PyQt5.QtCore import *

QtCore를 import 하고 스레드를 생성해줍니다.

threadWork1로 생성을 했습니다.

self.worker = threadWork1()

생성을 하고 스레드를 시작해주면 스레들 생성 및 실행이 완료됩니다.

self.worker.start()

 

 

QThread에서 데이터 사용

Qthread를 이용하여 데이터를 처리하고 결과를 얻으려면 메인에서 데이터를 signal과 slot이라는 개념이 존재하지만,

제가 다룰 것은 그것이 아니라 메인의 자원인 UI Widget과 변수를 사용할 수 있는 것에 대해서 다루도록 하겠습니다.

아직  signal과 slot에 대한 개념은 제가 습득하지 못하여서 다음에 기회가 되면 다루도록 하겠습니다.

 

소스코드에 주석을 달았습니다.

import sys

from PyQt5.QtWidgets import *
from PyQt5 import uic
from PyQt5.QtCore import *

# UI load
windowForm = uic.loadUiType(".\mainUI.ui")[0]

class MyApp(QMainWindow, windowForm):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        # Qthread 생성
        # main self인자를 스레드에 전달
        self.worker1 = threadWork1(self)
        self.worker1.start()

        # threadWork2에서 사용할 변수
        self.threadWork2VariableList = []

        # Qthread 생성
        self.worker2 = threadWork2(self)
        self.worker2.start()

        # timer 생성
        self.timer = QTimer()
        self.timer.setInterval(100)
        self.timer.timeout.connect(self.printFunction)
        self.timer.start()

    # 100ms 마다 threadWork2VariableList에 값이 있음을 체크 후에 textBrowser2에 데이타 작성
    def printFunction(self):
        if len(self.threadWork2VariableList) != 0:
            for num in range(len(self.threadWork2VariableList)):
                self.textBrowser2.append(self.threadWork2VariableList[num])
            self.threadWork2VariableList = []



class threadWork1(QThread):
    def __init__(self, parent): 
    	# main에서 받은 self인자를 parent로 생성
        super().__init__(parent)        
        self.parent = parent

    def run(self):
        for num in range(10):
            text = 'thread1 count = ' + str(num)
            self.parent.textBrowser1.append(text)

        # 쓰레드 종료
        self.quit()
        self.wait(5000)


class threadWork2(QThread):
    def __init__(self, parent):
    	# main에서 받은 self인자를 parent로 생성
        super().__init__(parent)
        self.parent = parent

    def run(self):
        for num in range(10):
            text = 'thread2 count = ' + str(num)
            self.parent.threadWork2VariableList.append(text)

        # 쓰레드 종료
        self.quit()
        self.wait(5000)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    myApp = MyApp()
    myApp.show()
    app.exec_()

실행결과 화면

 

 

QThread 소스 설명

QTextBrowser에 접근을 하여 데이터를 출력하는 스레드인 threadWork1과 메인 클래스에 있는

변수 threadWork2VariableList에 접근하여 데이터를 입력하는 threadWork2를 생성하여,

textBrowser1에는 threadWork1에서 실행한 데이터를 출력하고 textBrowser2에는 threadWork2에서 실행한 데이터를 출력하는 프로그램입니다.

 

생성을 하면서 main의 self 인자를 넘겨주면서 메인에서 사용하는 변수 및 UI에 접근을 할 수 있도록 해 주었습니다.

main class
# Qthread 생성
# main self인자를 스레드에 전달
self.worker1 = threadWork1(self)
self.worker1.start()

thread class
class threadWork1(QThread):
    def __init__(self, parent): 
    	# main에서 받은 self인자를 parent로 생성
        super().__init__(parent)        
        self.parent = parent

별도의 100ms 타이머를 실행하여 threadWork2에서 실행된 Data를 출력하였습니다.

# 100ms 마다 threadWork2VariableList에 값이 있음을 체크 후에 textBrowser2에 데이타 작성
def printFunction(self):
    if len(self.threadWork2VariableList) != 0:
        for num in range(len(self.threadWork2VariableList)):
            self.textBrowser2.append(self.threadWork2VariableList[num])
        self.threadWork2VariableList = []

QThread를 이용한 사용법에 대해서 정리를 하였습니다.

간혹 사용을 하는데 매번 프로젝트를 찾아서 어떻게 썼지? 하다가 기억을 위해서 정리를 하게 되었습니다.

문의 사항은 댓글을 통하여 소통을 했으면 좋겠습니다.

잘못된 부분이나 부족한 부분이 있으시면 댓글로 가르쳐 주시면 정말 감사하겠습니다. ㅎㅎ

 

QThread Document Link

 

QThread Class | Qt Core 5.15.9

 

doc.qt.io

 

 

 

  Python 관련 글
  [ProgramStudy/python] - [혼자서 공부해본 파이썬] 파이썬이란?
  [ProgramStudy/Development tool] - [파이썬 IDE] PyCharm 설치 하기!
  [ProgramStudy/Development tool] - [파이썬] 아나콘다 설치 하기!

 

저의 글을 읽어 주셔서 감사합니다. 오늘도 즐거운 하루 보내세요.

저의 글이 조금이나마 도움이 되셨다면 로그인이 필요 없는 공감♥ 한번 꾸욱 눌러주세요 하하~

 

728x90
반응형

카테고리의 글 목록 더보기

댓글 영역

Please Enable JavaScript!
Mohon Aktifkan Javascript![ Enable JavaScript ]