RoBoLoG

[Python] 10초 타이머 만들기 본문

Study/Python

[Python] 10초 타이머 만들기

SKJun 2023. 6. 16. 16:23

클래스 내에 is_on 변수와 timer 함수를 포함시키고 싶다면, 다음과 같이 코드를 수정할 수 있습니다


방법1. time.sleep 사용

import threading
import time

class MyClass:
    def __init__(self):
        self.is_on = False

    def timer(self):
        time.sleep(10)
        self.is_on = True

    def start_timer(self):
        timer_thread = threading.Thread(target=self.timer)
        timer_thread.start()
        timer_thread.join()
        print("is_on:", self.is_on)

# 클래스의 인스턴스 생성
my_object = MyClass()

# 타이머 시작
my_object.start_timer()

 

이 업데이트된 코드에서는 MyClass라는 클래스를 정의합니다. 클래스에는 __init__ 메서드가 있으며, 이 메서드는 인스턴스 변수 is_on을 False로 초기화합니다. timer 메서드는 클래스 내에 정의되어 있으며, self.is_on을 사용하여 인스턴스 변수에 접근합니다.

 

또한, start_timer라는 새로운 메서드를 추가하였습니다. 이 메서드는 스레드를 생성하고 self.timer를 대상 함수로 전달합니다. 스레드를 시작한 후 timer_thread.join()을 사용하여 스레드가 실행을 완료할 때까지 기다립니다. 마지막으로, self.is_on의 값을 출력하여 10초 지연 이후에 True로 변경되었는지 확인합니다.

 

이 클래스를 사용하기 위해 my_object = MyClass()와 같이 클래스의 인스턴스를 생성한 다음, my_object.start_timer()를 호출합니다.

 

이렇게 하면 is_on 변수와 timer 함수가 클래스 내에 캡슐화되며, self.is_on은 클래스의 인스턴스를 사용하여 접근하고 수정할 수 있습니다.

 

방법2. time.time() 사용

import threading
import time

class MyClass:
    def __init__(self):
        self.is_on = False
        self.event = threading.Event()

    def timer(self):
        start_time = time.time()
        while not self.event.is_set():
            if time.time() - start_time >= 10:
                self.is_on = True
                self.event.set()

    def start_timer(self):
        threading.Thread(target=self.timer).start()
        self.event.wait()
        print("is_on:", self.is_on)

# 클래스의 인스턴스 생성
my_object = MyClass()

# 타이머 시작
my_object.start_timer()

이 코드에서는 MyClass의 __init__ 메서드에서 threading.Event를 초기화하고, timer 메서드에서는 self.event의 상태를 확인하여 경과 시간을 계산하고, self.is_on이 True로 변경되면 self.event.set()을 호출하여 이벤트를 설정합니다.

start_timer 메서드에서는 스레드를 생성하고 self.timer를 대상 함수로 지정합니다. 그리고 self.event.wait()을 호출하여 이벤트가 설정될 때까지 대기합니다.

마지막으로 self.is_on의 값을 출력하여 10초 지연 이후에 True로 변경되었는지 확인합니다.

이렇게 하면 time.sleep() 대신 threading.Event와 time.time()을 사용하여 타이머 함수를 구현할 수 있습니다.

728x90
반응형