2017-02-13 6 views
0

Мне нужно иметь возможность переключать значение логического значения через определенное количество времени, пока остальная часть моего кода продолжает работать как обычно. То, что происходит в основной части кода, зависит от значения Bool.Изменение переменной после определенного количества времени python

Вот моя попытка с предложением goodguy, но я все еще не могу заставить его работать. «play» переключается на True, когда я вызываю класс, но не переключается обратно на False через 2 секунды, поэтому звук воспроизводится только один раз. Что я делаю не так?

class TimedValue: 

    def __init__(self): 
     self._started_at = datetime.datetime.utcnow() 

    def __call__(self): 
     time_passed = datetime.datetime.utcnow() - self._started_at 
     if time_passed.total_seconds() > 2: 
      return False 
     return True 

playing = False 
while True: 
    trigger = randint(0,10) # random trigger that triggers sound 
    if trigger == 0 and playing == False: 
    #play a tone for 2 seconds whilst the random triggers continue running 
    #after the tone is over and another trigger happens, the tone should play again 
     thread.start_new_thread(play_tone, (200, 0.5, 2, fs, stream,)) 
     value = TimedValue() 
     playing = value() 

    time.sleep(0.1) 
+0

Вы можете включить код для Вашего лучшая попытка? Гораздо легче понять проблему, если есть начальная основа. – roganjosh

+0

Это нормально? У меня действительно нет лучшей попытки, ничего не работает. – ElanaLS

ответ

0

вы можете использовать ThreadPool класс от модуля multiprocessing:

import time 

myBool = False 

def foo(b): 
    time.sleep(30) #time in seconds 
    return not b 

from multiprocessing.pool import ThreadPool 

pool = ThreadPool(processes=1) 
result = pool.apply_async(foo,[myBool]) 

b = result.get() 
1

Threading и многопроцессорные звучит как излишним для этого случая. Другой возможный способ определить что-то вроде отзывной класса, чей экземпляр помнит время он был создан для измерений:

import datetime 

class TimedValue: 

    def __init__(self): 
     self._started_at = datetime.datetime.utcnow() 

    def __call__(self): 
     time_passed = datetime.datetime.utcnow() - self._started_at 
     if time_passed.total_seconds() > XX: 
      return True 
     return False 

value = TimedValue() 

и при использовании value() как вызываемая в других частях кода

+0

Как получить возвращаемое значение из класса? Извините, я новичок в этом ... Я попробовал распечатать TimedValue, и это то, что я получил: <__ main __. Экземпляр TimedValue в 0x1049e33b0> – ElanaLS

+0

Как он сказал. value = TimedValue(), а затем в любое время вам понадобится значение, значение вызова(). –

+1

На самом деле даже использование '__call__' немного переборщило. Свойство было бы немного легче понять для начинающего IMHO (my_timed_value.value). +1 для того, чтобы показать, как ответить на необходимость, а не делать многопроцессорность (избегая проблемы XY). –

Смежные вопросы