2016-04-17 1 views
0

J'ai un morceau de code qui a une procédure, je veux seulement que le proc se déclenche, au plus toutes les 2 minutes. S'il s'est déclenché au cours des 2 dernières minutes, il devrait simplement quitter. Actuellement, il a un petit délai avant de s'exécuter (après 5000), mais ce que cela semble faire, est de mettre en file d'attente toutes les autres demandes d'exécution qui ont eu lieu au repos (5 secondes), puis de pummel les commandes en file d'attente dans une vague d'activité.arrêter tcl procédure de fonctionner plus régulièrement qu'une fois toutes les 2 minutes, peu importe combien de fois il est appelé

Évidemment, cela manque une partie importante, mais
j'ai envisagé de faire quelque chose avec des variables telles que:

#gets current time since epoch as var0 
set timer0 clock format [clock seconds] -format %s 
#gets current time since epoch as var1 
set timer1 clock format [clock seconds] -format %s 
#calculates elapsed time since epoch in seconds, converts seconds to minutes 
set split [ expr (($timer0 - $timer1)/60)/60 ] 
if { $split > 2 } { 
    my_proc $maybe_1var $maybe_2vars $maybe_3vars 
} else { 
    exit super gracefully 
} 

Je peux fournir des extraits de mon code actuel si vous le souhaitez. Ce n'est pas aussi élégant que ce que j'imagine, et je ne suis pas sûr qu'il existe de meilleures façons de le faire dans Tcl.

+0

pouvez-vous s'il vous plaît affiner votre histoire et de supprimer des bruits comme G'day, etc. Des cris de joie? – manetsus

+0

excuses .. il a maintenant été rangé. laissez-moi savoir si c'est encore trop occupé. – Matty

+0

Je viens de mettre à jour votre question, je l'approuve, sinon les réviseurs l'approuveraient dans quelques heures. – manetsus

Répondre

1

Une solution possible:

set lastExecuted "" 

proc foo {} { 
    global lastExecuted 
    set currentTimestamp [clock scan seconds] 
    if {$lastExecuted != "" && ($currentTimestamp - $lastExecuted) > 120} { 
     exit 
    } 
    set lastExecuted $currentTimestamp 
    # continue execution 
} 
+0

c'est beaucoup plus élégant que mon code bâtard. Le problème que j'ai eu avec ce genre de chose par le passé est avec la variable lastExecuted, même si elle est définie à la fin de la procédure, elle serait vidée chaque fois que le script est appelé - Ce ne serait pas le cas ici? Donc, en fait, sauf pour un court laps de temps entre les exécutions, lastExecuted aurait une valeur nulle. Ou était-ce juste mes pauvres déclarations variables, dans Tcl peut-être? – Matty

+0

Vous avez raison - si le script est déclenché à chaque fois, la variable sera vidée si elle est conservée dans le script. Cela fonctionnerait dans le cas d'une application en cours d'exécution (disons un démon). Dans le premier cas, vous pouvez externaliser cette variable dans un fichier de configuration (ou une base de données si cela vous est possible). Le script vérifierait alors la présence de ce fichier de configuration, en lirait la variable et serait capable de conserver les informations sur plusieurs exécutions. – Sharad

+0

En fait, j'ai des problèmes de logique plus grands que pour le moment .. lastExecuted est amorcé avec une valeur nulle, et il n'est pas mis à jour avec une date/heure réelle jusqu'à ce que la procédure foo, doit être vrai (et ce n'est pas le cas, car à ce stade $ lastExecuted == "" encore), avant que le code s'exécute à l'endroit où je pense qu'une autre instruction else devrait être d'amorcer la variable lastExecuted avec l'horodatage requis .. et exécuter mon code .. – Matty