안녕하세요.
프로그래밍을 하면서 여러 동작을 하기 위해서는 쓰레드란 개념을 알아야 합니다.
우선, 작업관리자를 한 번 보겠습니다.
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해주면 간단하게 해결됩니다.