본문 바로가기
Python, API

QEventloop

by 오늘밤날다 2021. 7. 14.

QEventloop에 대한 이해가 부족해서 간단한 예시를 만들어 보았다.

 

  • timer0, timer1, timer2를 순차적으로 등록 실행하고 1초마다 실행한다.
    • timer0은 check변수를 1씩 더하고 10이 되면 QEventloop를 종료시킨다.
    • timer1은 무조건 실행
    • timer2는 eventloop가 실행되고 있지 않을때만 print
  • create_event_loop함수를 통해 QEventloop를 실행하고 이 이벤트루프가 timer0에 의해 종료되는 시점까지 create_event_loop함수는 대기하고 있다가 '이벤트루프종료'라는 메세지를 출력한다.
  • run_other함수는 create_event_loop함수 내에서 이벤트루프가 종료되기 전에 실행되지 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# -*- coding: utf-8 -*-
import sys
from PyQt5.QAxContainer import QAxWidget
from PyQt5.QtCore import QEventLoop, QTimer
from PyQt5.QtWidgets import QApplication
from datetime import *
 
 
class Main(QAxWidget):
    def __init__(self):
        super().__init__()
        self.eventloop = None
        self.start_time_marker = datetime.now()
        self.eventloop_start_time_marker = None
 
        self.check = 0
        self.check_list = [10]
 
        # 타이머설정
        self.timer0 = QTimer(self)
        self.timer0.start(1000)
        self.timer0.timeout.connect(self.run0)
 
        self.timer1 = QTimer(self)
        self.timer1.start(1000)
        self.timer1.timeout.connect(self.run1)
 
        self.timer2 = QTimer(self)
        self.timer2.start(1000)
        self.timer2.timeout.connect(self.run2)
 
        self.create_event_loop()
 
        self.run_other()
 
    def run0(self):
        self.check = self.check + 1
        print(f'타이머0: {datetime.now()}|{self.check}|{self.eventloop.isRunning()}')  # 이벤트루프의 상태를 반환
        if self.check in self.check_list:
            print(f'event loop exit')
            self.eventloop.exit()
 
    def create_event_loop(self):
        self.eventloop_start_time_marker = datetime.now()
        self.eventloop = QEventLoop()
        print(f'이벤트루프생성:{self.eventloop_start_time_marker}')
        self.eventloop.exec_()
 
        print(f'이벤트루프종료')
 
    def run1(self):
        print(f'타이머1:{datetime.now()}')
 
    def run2(self):
        if not self.eventloop.isRunning():
            print(f'타이머2:{datetime.now()}')
 
    def run_other(self):
        print(f'Run_other')
 
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = Main()
    app.exec_()
cs

 

  • 실행내역
    • 이벤트루프가 실행되고 종료되는 시점까지 timer0, timer1, timer2가 실행되나 timer2는 eventloop.isRunning가 True(이벤트루프 실행중)인 경우 시간을 표시하지 않고 기다린다.
    • create_event_loop함수 뒤에 실행된 run_other는 이벤트루프가 종료되고 난 후에 실행된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
이벤트루프생성:2021-07-14 19:37:13.175599
타이머1:2021-07-14 19:37:14.184710
타이머0: 2021-07-14 19:37:14.184710|1|True
타이머1:2021-07-14 19:37:15.189881
타이머0: 2021-07-14 19:37:15.189881|2|True
타이머1:2021-07-14 19:37:16.179242
타이머0: 2021-07-14 19:37:16.179242|3|True
타이머1:2021-07-14 19:37:17.201177
타이머0: 2021-07-14 19:37:17.201177|4|True
타이머1:2021-07-14 19:37:18.196125
타이머0: 2021-07-14 19:37:18.196125|5|True
타이머1:2021-07-14 19:37:19.200046
타이머0: 2021-07-14 19:37:19.200046|6|True
타이머1:2021-07-14 19:37:20.194486
타이머0: 2021-07-14 19:37:20.194486|7|True
타이머1:2021-07-14 19:37:21.204355
타이머0: 2021-07-14 19:37:21.204355|8|True
타이머1:2021-07-14 19:37:22.200170
타이머0: 2021-07-14 19:37:22.200170|9|True
타이머1:2021-07-14 19:37:23.197142
타이머0: 2021-07-14 19:37:23.197142|10|True
event loop exit
이벤트루프종료
Run_other
타이머2:2021-07-14 19:37:24.199179
타이머1:2021-07-14 19:37:24.199179
타이머0: 2021-07-14 19:37:24.199179|11|False
타이머2:2021-07-14 19:37:25.194430
타이머1:2021-07-14 19:37:25.194430
타이머0: 2021-07-14 19:37:25.194430|12|False
cs