Quero disparar uma função a cada 0,5 segundos e ser capaz de iniciar e parar e zerar o cronômetro. Não tenho muito conhecimento de como os threads do Python funcionam e estou tendo dificuldades com o cronômetro do Python.
No entanto, continuo recebendo RuntimeError: threads can only be started once
quando executo threading.timer.start()
duas vezes. Existe uma solução alternativa para isso? Tentei me inscrever threading.timer.cancel()
antes de cada início.
Pseudo-código:
t=threading.timer(0.5,function)
while True:
t.cancel()
t.start()
python
python-3.x
python-2.7
user1431282
fonte
fonte
threading.Event
e emwait
vez desleep
. Então, para acordá-lo, basta definir o evento. Você nem mesmo precisa doself.stopped
then porque apenas verifica a sinalização do evento.event.wait
iria apenas expirar e agir como um adormecido, mas se você quisesse parar (ou interromper de outra forma o thread), você configuraria o evento do thread e ele seria ativado imediatamente.thread.start()
me dáthreads can only be started once
De Equivalent de setInterval em python :
Uso:
Ou aqui está a mesma funcionalidade, mas como uma função autônoma em vez de um decorador :
Veja como fazer isso sem usar threads .
fonte
@setInterval(1)
.stop = repeat(every=second, call=your_function); ...; stop()
,.stop = call_repeatedly(interval, your_function); ...; stop()
implementaçãoUsando threads de cronômetro-
isso pode ser interrompido por
t.cancel()
fonte
cancel
método. Quando é chamado, o encadeamento 1) não está em execução ou 2) está em execução. Em 1) estamos esperando para executar a função, então cancelar funcionará bem. em 2) estamos executando atualmente, então cancelar não terá efeito na execução atual. além disso, a execução atual é reprogramada para não ter efeito no futuro.Aprimorando um pouco a resposta de Hans Then , podemos apenas criar uma subclasse da função Timer. O seguinte torna-se o nosso código de "cronômetro de repetição" inteiro e pode ser usado como um substituto para threading.Timer com todos os mesmos argumentos:
Exemplo de uso:
produz a seguinte saída:
e
produz
fonte
RuntimeError: threads can only be started once
,.threading.py
próprio módulo.No interesse de fornecer uma resposta correta usando o Timer conforme solicitado pelo OP, aprimorarei a resposta de swapnil jariwala :
fonte
Eu mudei algum código no código swapnil-jariwala para fazer um pequeno relógio de console.
Temporizador com interface gráfica tkinter
Este código coloca o cronômetro do relógio em uma pequena janela com tkinter
Um exemplo de jogo de flashcards (mais ou menos)
resultado:
fonte
Eu tive que fazer isso para um projeto. O que acabei fazendo foi iniciar um thread separado para a função
**** batimento cardíaco é minha função, trabalhador é um dos meus argumentos ****
dentro da minha função de batimento cardíaco:
Portanto, quando eu inicio o thread, a função espera repetidamente 5 segundos, executa todo o meu código e faz isso indefinidamente. Se você quiser encerrar o processo, basta encerrar o thread.
fonte
Implementei uma classe que funciona como um cronômetro.
Deixo o link aqui caso alguém precise: https://github.com/ivanhalencp/python/tree/master/xTimer
fonte
Aqui está uma pequena amostra, que ajudará a entender melhor como funciona. function taskManager () no final cria uma chamada de função atrasada para ela mesma.
Tente mudar a variável "dalay" e você será capaz de ver a diferença
fonte
Eu gosto da resposta do right2clicky, especialmente porque não requer que um Thread seja derrubado e um novo criado toda vez que o Timer for ativado. Além disso, é uma substituição fácil criar uma classe com um retorno de chamada do cronômetro que é chamado periodicamente. Este é meu caso de uso normal:
fonte
Esta é uma implementação alternativa usando função em vez de classe. Inspirado por @Andrew Wilkins acima.
Porque esperar é mais preciso do que dormir (leva em consideração o tempo de execução da função):
fonte
Eu vim com outra solução com a classe SingleTon. Por favor, diga-me se houver algum vazamento de memória aqui.
fonte