У меня есть поток Python, который должен отображать сообщение каждую секунду, в то время как остальная часть скрипта продолжает работать. Но функция timer.cancel не работает, так как продолжает работать даже после завершения основного цикла:

from threading import *
import time
import sys

a = 0

def x():
    while(True):
        global a
        print
        print 'Beep', a
        print
        time.sleep(1)   # wait 1 second      

t = Timer(1.0, x)       # create thread
t.start()               # start thread

while True:
    a = a + 1
    print a
    time.sleep(0.1)

    if a > 30:    
        t.cancel()
    if a > 50:
        sys.exit()

Что я делаю не так ?

2
user1530405 19 Янв 2016 в 06:51

2 ответа

Класс threading.Timer имеет один cancel, но он не отменяет поток, а останавливает фактическое срабатывание таймера. Фактически, метод cancel устанавливает threading.Event, и поток, фактически выполняющий threading.Timer, будет проверять это событие после того, как он завершит ожидание, и до того, как он фактически выполнит обратный вызов.

Вот, возможно, одно решение, отвечающее вашим требованиям.

import threading
import time
import sys

a = 0

class TimerClass(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.event = threading.Event()

    def run(self):
        while not self.event.is_set():
            global a
            print
            print 'Beep', a
            print
            self.event.wait(1)

    def stop(self):
        self.event.set()

t = TimerClass()
t.start()

while True:
    a = a + 1
    print a
    time.sleep(0.1)

    if a > 30:    
        t.stop()
    if a > 50:
        sys.exit()
2
Community 23 Май 2017 в 13:29

Проблема с вашим кодом потоковой передачи, насколько я могу получить, заключается в том, что ваша звуковая часть выполняется с таймером, установленным на 1 секунду, даже когда ваша часть a = a + 1 остановлена, поэтому просто то, что вы можете сделать, это добавить условие в звуковую часть как:

    time.sleep(1)         
    if a>50:
      sys.exit()

Это остановит выполнение потока, и вы получите желаемый результат.Это самая простая вещь, которую вы можете сделать, или следуйте методу zangw (), который хорошо работает для запуска и остановки потока.

0
RAJ GUPTA 19 Янв 2016 в 08:39