Timers Utimers
Les fonctions Timer et Utimer permettent de faire une action dans les prochaines minutes/secondes que vous aurez définit.
Contents
Déclenchement de timer
Syntaxes
Utilisation
proc exemple_timer {
puthelp "PRIVMSG #salon :Voici le message qui sera envoyé toutes les X minutes"
[[Timer|timer]]3 exemple_timer 0
}
proc exemple_utimer
puthelp "PRIVMSG #salon :Voici le message qui sera envoyé toutes les X secondes"
[[Timer|timer]]180 exemple_utimer 0
}
Le premier exemple renvoie "ok !!" immédiatement, tandis que le second renvoie "ok !!" 3 secondes plus tard :
[[Utimer|utimer]] 3 [putlog "ok !!"] 0
[[Utimer|utimer]] 3 [list putlog "ok !!"] 0
Gestion des timers
Un des problèmes des timers, c'est que l'on a parfois besoin de les supprimer. Pour cela, il faut connaitre son nom ou son id, il y a plusieurs méthodes pour cela.
Listage des timers
Il est possible de lister les Timers en cours avec utimers et timers.
Ces deux fonctions retournent une liste des Timers sous la forme:
{time_left procedure timer_id}
avec:
- time_left : le temps restant pour le timer
- procedure : la procédure appelée par le timer
- timer_id : L'id unique du timer
Le temps restant sera soit en minutes soit en secondes, selon que vous utilisiez timers ou utimers
Tuer un timer
Il existe killtimer et killutimer pour tuer un (u)timer. Elles prennent comme argument l'ID unique du timer concerné. La difficulté est donc de retrouver cet ID.
Solution basique
On peut faire une boucle sur la liste des timers et chercher celui (ou ceux) qui déclenchent la procédure cible (que l'on connait).
proc killMyTimer { ttype myproc } {
# ttype : type de timer (utimer ou timer)
# myproc : nom de la procédure appelée
if { $ttype == "utimer" } {
foreach ctimer [utimers] {
if { [lindex $ctimer 1] == $myproc } {
killutimer [lindex $ctimer 2]
}
}
} else {
foreach ctimer [timers] {
if { [lindex $ctimer 1] == $myproc } {
killtimer [lindex $ctimer 2]
}
}
}
}
Cette procédure tuera tous les (u)timers qui appellent myproc
Solution élaborée
Cette solution est plus élaborée car elle agit aussi sur l'appel des timers. En effet, en utilisant list pour lancer un timer, vous pouvez récupérer son ID. Ce qui donne donc:
proc exemple_utimer
global mytimer
puthelp "PRIVMSG #salon :Voici le message qui sera envoyé toutes les X secondes"
set mytimer [list [timer 180 exemple_utimer]]
}
bind dcc - "tuetimer" tueTimer
proc tueTimer {} {
global mytimer
killtimer $mytimer
}
Voir aussi
After pour descendre sous la seconde.