2014-04-19 10 views
5

Ho un programma Python 2-7 che esegue un ciclo while infinito e voglio incorporare un interrupt del timer. Quello che mi propongo di fare è impostare un timer ad un certo punto del ciclo, e quando sono trascorsi 5 secondi voglio che il codice si diramazioni verso una parte specifica del ciclo while.Interrupt in tempo reale in Python

Quello che ho fatto fino ad ora è la seguente: in ogni iterazione del ciclo while sto verificando quanto tempo è trascorso quando raggiungo quel punto del codice utilizzando

time.clock() 

e se la differenza supera 5 ho eseguito il pezzo di codice che intendo correre

Tuttavia in questo modo 7 secondi potrebbero trascorrere prima che valuto il tempo, sarà> 5sec ma voglio andarci esattamente quando trascorrono 5 secondi

Inoltre, ho bisogno che questo funzioni per più di 1 contatore (probabilmente fino a 100) ma non voglio che gli interrupt si interrompano a vicenda. Anche l'uso di Timer non ha funzionato.

So che questo può essere fatto usando gli interrupt del timer in assembly ma come posso farlo in python?

+1

A differenza dei siti di forum, non utilizziamo "Grazie" o "Qualsiasi aiuto apprezzato" o firme su [so]. Vedi [Se 'Hi', 'thanks', tagline e saluti saranno rimossi dai post?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be- rimozione dal messaggi). – rene

risposta

3

Se un singolo evento deve essere gestito, il modo più semplice è utilizzare il framework signal che è un standard module of Python.

Tuttavia, se è necessario uno scheduler completo, è necessario ricorrere a un altro modulo: sched. Here è un puntatore alla documentazione ufficiale. Si noti, tuttavia, che negli ambienti a più thread schedpresenta limitazioni relative alla sicurezza del thread.

Un'altra opzione è la Advanced Python Scheduler, che non fa parte della distribuzione standard.

+0

Dalla mia esperienza molto limitata con Python quello che ho capito è che il segnale o il timer possono essere usati per 1 evento, come posso creare un array dinamico di tali eventi? questo si sta rivelando fastidioso –

+0

Quindi sto inviando fotogrammi e voglio un timer per ogni fotogramma, se un fotogramma non viene riconosciuto prima del timer * ITS OWN *, quindi quando il timer si attiva, voglio inviarlo di nuovo frame, e se timer2 si avvia mentre sto inviando un frame, esso deve attendere, senza interrompere se non nei punti specificati nel codice –

0

Non è possibile ottenere real-time senza supporto hardware/software speciale. Non è necessario nella maggior parte dei casi (do you need to control giant robots?).

Come ritardare diverse chiamate di funzione dai numeri noti di secondi dipende dalle vostre esigenze per esempio, se un tempo necessario per eseguire una funzione è trascurabile rispetto al ritardo tra le chiamate allora si potrebbe run all functions in a single thread:

#!/usr/bin/env python 
from __future__ import print_function 
from Tkinter import Tk 

root = Tk() 
root.withdraw() # don't show the GUI window 
root.after(1000, print, 'foo') # print foo in a second 
root.after(0, print, 'bar') # print bar in a jiffy 
root.after(2000, root.destroy) # exit mainloop in 2 seconds 
root.mainloop() 
print("done") 

Implementa il tuo "Non voglio che gli interrupt si interrompano a vicenda" perché il prossimo callback non viene chiamato fino a quando il precedente non è completo.