2010-03-05 11 views
2

Y a-t-il un moyen dans TCL d'inclure un morceau de code dans un bloc de timeout? Ce que je veux dire par là, c'est que le bloc sortira après un délai d'attente particulier même si l'exécution n'est pas terminée. Par exemple: -timeout utilisant TCL

timeout (interval) { 
#wait for socket connection here 

} 

Si aucune connexion est établie dans l'intervalle de temps, les sorties de bloc.

Merci et salutations, Anjali

Répondre

5

Anjali, Vous cherchez vwait.

Voici un exemple: Attendez cinq secondes pour une connexion à un socket serveur, sinon fermer le socket et continuer d'exécuter le script:

# Initialise the state 
after 5000 set state timeout 
set server [socket -server accept 12345] 
proc accept {args} { 
    global state connectionInfo 
    set state accepted 
    set connectionInfo $args 
} 

# Wait for something to happen 
vwait state 

# Clean up events that could have happened 
close $server 
after cancel set state timeout 

# Do something based on how the vwait finished... 
switch $state { 
    timeout { 
     puts "no connection on port 12345" 
    } 
    accepted { 
     puts "connection: $connectionInfo" 
     puts [lindex $connectionInfo 0] "Hello there!" 
    } 
} 

Modifier Vous devez communiquer avec votre appareil UART en utilisant non blocking I/O.

+0

Salut Byron, merci pour la réponse. J'aurais dû être plus précis dans la question. Ce que je dois réellement faire est d'envoyer des données via l'interface UART à mon appareil sous test et parfois le script se bloque en faisant cela. J'ai besoin d'interrompre le script/bloc dans ce cas. Je pensais qu'un bloc de délai d'attente aidera. Des idées quoi d'autre que je peux faire? – Anjali

+0

Vous devriez être capable d'adapter le code ci-dessus pour ce faire. Ajoutez simplement votre code pour faire la connexion UART entre 'after' et' vwait'. Avoir les résultats vont dans l'état. Après le 'vwait', fermez la connexion UART. Regardez de plus près le code ci-dessus et il devrait être clair. –

+0

vwait + après ne pas résoudre la question générique proposée. La solution ne fonctionne que dans le cas spécifique du besoin d'Anjali, et seulement si on utilise des E/S non bloquantes comme mentionné par Byron. Vérifiez ma question/réponse pour comprendre pourquoi: http://stackoverflow.com/questions/23096240/tcl-vwait-and-after-not-as-expected Je suis toujours à la recherche d'un moyen de mettre en œuvre cela, si quelqu'un sait ... :) – msb