반응형

안녕하세요.

 

프로그래밍을 하면서 여러 동작을 하기 위해서는 쓰레드란 개념을 알아야 합니다. 

 

우선, 작업관리자를 한 번 보겠습니다.

 

작업관리자

CPU는 한 번에 한 가지의 동작밖에 하지 못합니다. 하지만 G(10의 9제곱)단위로 동작합니다.

 

작업관리자를 확인하면 CPU는 하나인 반면, 프로세스는 184개가 1958개의 쓰레드를 통해 동작하는 것을 확인할 수 있습니다.

 

CPU는 시간, 우선순위 등 여러가지 방식으로 할당합니다.

 

예를 들어,

 

간단한 쓰레드 구조

이런식으로 쓰레드 1번 수행, 2번 수행, 다음 3번 수행하면서 반복합니다.

 

그러나 그 속도가 굉장히 빨라 사람들이 사용하는데 알아차리지 못합니다. 

 

#쓰레드를 선언하지 않은 예제
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import time
import sys


class MainWidget(QWidget):
    def __init__(self):
        super().__init__()
        thread_start = QPushButton("시 작!")
        thread_start.clicked.connect(self.increaseNumber)

        vbox = QVBoxLayout()
        vbox.addWidget(thread_start)
		
        self.resize(200, 200)
        self.setLayout(vbox)
	
    #버튼을 누르면 1씩 증가하는 함수
    def increaseNumber(self):
        for i in range(10):
            print("Thread :",i)
            time.sleep(1)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = MainWidget()
    widget.show()
    sys.exit(app.exec_())

쓰레드를 선언하지 않고 버튼을 누르면 0부터 9까지 수행하는 간단한 PyQt5를 예시를 보겠습니다.

 

코딩에서는 쓰레드를 선언하지 않았지만, 사실 여기에는 쓰레드가 사용되고 있습니다. 

 

바로 GUI에서 사용되고 있습니다. 

 

이 프로그램을 돌려 보시면, 버튼을 누르고 함수가 수행을 마칠 때까지 GUI는 동작하지 않습니다.

 

아마 응답하지 않는다고 경고창이 뜰 것입니다. 

 

그 이유는 이 프로그램에 할당된 쓰레드는 하나이고, 이미 함수를 동작하는데 쓰레드가 사용되고 있으니, GUI는 그 동안 동작하지 않습니다. 

 

그렇다면 쓰레드를 한 번 사용해서 GUI도 움직이고, 함수도 동작하는 예제를 작성해보겠습니다.

#쓰레드를 선언한 간단한 예제
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import time
import sys


#쓰레드 선언
class Thread1(QThread):
    #parent = MainWidget을 상속 받음.
    def __init__(self, parent):
        super().__init__(parent)
    def run(self):
        for i in range(10):
            print("Thread :",i)
            time.sleep(1)


class MainWidget(QWidget):
    def __init__(self):
        super().__init__()
        thread_start = QPushButton("시 작!")
        thread_start.clicked.connect(self.increaseNumber)

        vbox = QVBoxLayout()
        vbox.addWidget(thread_start)

        self.resize(200,200)
        self.setLayout(vbox)

    def increaseNumber(self):
        x = Thread1(self)
        x.start()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = MainWidget()
    widget.show()
    sys.exit(app.exec_())

QThread를 선언하고 자신이 실행시키고자 하는 함수를 run에 작성해줍니다. 

 

그리고 선언한 쓰레드 클레스를 객체를 생성해주고 객체를 start해주면 간단하게 해결됩니다.

 

728x90
반응형

+ Recent posts