2017-08-06 2 views
1

J'essaie d'exécuter proc avec un nouveau processus J'essaie d'appeler proc1 et proc2 à partir de la fonction principale, mais chacun devrait fonctionner séparément avec un nouveau processus (ou sous-processus) et aussi attendre jusqu'à ce qu'il termineTCL: exécuter proc avec le nouveau processus du même fichier

proc main { var } { 
     puts "main function with var: $var" 
     #call proc1 with new process 
     exec proc1 1 
     #wait till proc1 finish 
     #call proc2 with new process 
     exec proc2 2 
     #wait till proc2 finish 
     puts "Finished" 
    } 

    proc proc1 { var1 } { 
     puts "proc1 function with var: $var1" 
    } 

    proc proc2 { var2 } { 
     puts "proc2 function with var: $var2" 
    } 

J'ai essayé d'utiliser exec mais ça n'a pas marché j'ai essayé googler, mais n'a pas réussi à trouver une solution

Comment puis-je le faire fonctionner?

Merci beaucoup!

+1

si vous voulez un processus séparé, gardez ces procs dans un fichier séparé et appelez-les avec le processus 'tclsh' – Dinesh

+0

Pensez à utiliser des threads pour cela. Ils sont beaucoup plus faciles à utiliser. –

Répondre

0

Le mécanisme le plus simple est de mettre les procédures dans un fichier séparé (par exemple, myprocs.tcl) avec le bit suivant du code supplémentaire à la fin du fichier:

# Take a command from stdin, evaluate it, and write result to stdout 
puts [eval [read stdin]] 

Ensuite, vous appelez ces procédures à l'aide l'aide suivante:

proc runproc {procname args} { 
    exec [info nameofexecutable] myprocs.tcl << [list $procname {*}$args] 2>@stderr 
} 

# Demonstrating 
set result [runproc proc1 1] 

Ce qui précède n'est pas le mécanisme le plus robuste cependant. En particulier, si vous avez un bug dans vos procédures, les choses vont devenir assez fades. Voici un mécanisme plus robuste qui fonctionne très bien à condition que vous changer vos procédures pour return leurs résultats au lieu de puts les ing:

côté Callee:

set cmd [read stdin] 
catch $cmd msg opts 
puts [list $msg $opts] 
exit 

côté de l'appelant:

proc runproc {procname args} { 
    set cmd [list $procname {*}$args] 
    set pair [exec [info nameofexecutable] myprocs.tcl << $cmd 2>@stderr] 
    lassign $pair msg opts 
    return -options $opts $msg 
} 

Transfert d'un stdout normale en même temps ou permettant au sous-processus d'accéder à stdin de l'appelant, nécessite encore plus de travail pour déplacer le canal de commande et de contrôle pour être autre que Tandard pipe, et ce qui précède est assez bon pour beaucoup de choses.