2013-03-07 7 views
6

Ho aggiunto una funzione lambda()-run-with-idle-timer in questo modo:Come rimuovere una funzione da run-with-idle-timer?

(run-with-idle-timer my-configurable-idle-time t 
       (lambda() 
        ;;; do something 
       )) 

E 'possibile rimuovere questa funzione in un momento successivo di nuovo dal grilletto timer di inattività?

risposta

6

Ho anche imbattuto in una situazione simile, dove volevo uccidere un temporizzatore ho iniziato con:

(setq my-timer (run-with-timer 5 5 'my-func)) 

Tuttavia,

(cancel-timer my-timer) 

non funzionava perché ha detto my-timer non era set (non so perché questo stava accadendo).

Oltre al metodo del primo manifesto, che possono essere uccisi con:

(cancel-function-timers 'my-func) 

Questo annulla tutti i timer chiamando la funzione 'my-func.

di ucciderlo alterando temporizzatore-list, che ho anche provato, ho fatto quanto segue:

(length timer-list) ;; I had two timers..one good, one bad 
(cdr timer-list) ;; I verified the last was the one I wanted to keep 
(setq timer-list (cdr timer-list)) ;; I reset timer-list 

Ovviamente, questa struttura della lista può variare, quindi dovrete regolare di conseguenza. Sostituisci "timer-idle-list" se hai avviato il timer con (run-with-idle-timer)

Questo dovrebbe funzionare anche se hai iniziato il timer con 'gamegrid-start-timer e' gamegrid-kill-timer non funziona, dal momento che 'GameGrid-start-timer è essenzialmente solo un wrapper per' gestito con timer

1

Un'altra soluzione: se sei fuori di fortuna e non si può effettivamente annullare il timer, si può sempre utilizzare

(defvar my-timer-enabler t) 
(run-with-idle-timer my-configurable-idle-time t 
        (lambda() 
         (when my-timer-enabler 
         ;;; do something 
         ))) 

Così si può disattivare il timer impostando my-timer-enabler-nil. E successivamente è possibile riattivare il timer semplicemente impostando la variabile su t.

Problemi correlati