PyQt(3) ≡ QThread

Acrylic·2024년 3월 21일

Thread

CPU가 독립적으로 처리하는 하나의 작업 단위

이번에는 QThread를 이용해서 작업을 해 보겠습니다.
프로그래밍 언어에서 스레드는 이해하기 쉽게 말하자면 다른 작업을 대기하지 않고 작업을 수행하는 개념이라 보시면 됩니다.

time.sleep을 아시는 분이라면QThread 말고 그냥 time.sleep을 쓰면 되지 않을까 싶을 수도 있습니다. 하지만 일정 부분에선 스레드가 필요한 경우가 있습니다.

가령 어떤 내용을 띄운 다음, 다음 걸로 넘어가게 하고 싶은데 갑자기 실행되는 경우가 있습니다. time.sleep을 안 썼기 때문이겠죠? 그래서 썼는데 그 내용은 안 나오고 몇 초간 멈추다가 다음 걸로 넘어가는 상황이 일어날 수 있습니다.

사진으로 예시를 들겠습니다.

1+1=2죠?(아닌뒈? 1+1은 3인뒈?)
그래서 제가 2를 눌렀습니다.

헉! 저 화면 그대로인 상태로 몇 초 있다가 다음 걸로 넘어갔네요!
이러면 time.sleep을 쓴 것만으로 해결할 순 없겠네요.

어 근데 QTime이라고 있지 않나요?

맞긴 한데 이거 쓰면 래그(규범 표기다)가 오지게(표준어다) 걸립니다. 궁금하시면 직접 써 보세요.

아무튼, 이럴 때 필요한 게 QThread입니다.
스레드가 있으면 여러 일 처리를 동시에 할 수 있는 장점이 있죠.
흠 근데 물론 Asyncio(JS에서 async)가 더 좋긴 합니다. 그건 나중에 배우도록 하고 아무튼 어떻게 쓰냐! 이렇게 쓰면 됩니다.

from PyQt6.QtCore import QThread

일단 QThread를 추가해 준 다음에 이렇게 선언해 주면 됩니다.

class (스레드 이름)(QThread):

    def run(self):
        # 내가 쓸 코드
	
    	def run(self):
        	self.stop()
        
        def stop(self):
                self.quit()

이제 사용은 이렇게 하면 되고요.

self.(스레드 변수 이름) = None
self.(스레드 변수 이름) = (스레드 이름)()
self.(스레드 변수 이름).start()

흠 근데 변수가 즉각적으로 바뀌는 코드를 짜고 싶다고요?
그럼 이렇게 하시면 됩니다.

class (스레드 이름)(QThread):

    def run(self):
    	changeText = pyqtSignal((반환할 변수 타입))

		def run(self):
        	(변수 이름) = ~~
        	self.changeText.emit((변수 이름))
        	self.stop()
        
        def stop(self):
                self.quit()

그러면 실행도 조금 달라집니다.

self.(스레드 변수 이름) = None
self.(스레드 변수 이름) = (스레드 이름)()
self.(스레드 변수 이름).changeText.connect(self.(연결할 함수 이름))
self.(스레드 변수 이름).start()

changeText는 예시를 든 거고 바꿔도 됩니다.

실행하면 스레드 클래스에 있는 게 작동되면서 동시에 켜져 있는 창도 작동이 가능해집니다. 그래서 스레드에 emit을 하시면 pyqtSignal에 적혀 있는 반환 타입으로 변수가 연결한 함수로 넘어갑니다. 간단하죠?(안 간단한가)

profile
프런트엔드 개발자 지망생

0개의 댓글