TCL: comunicación bidireccional entre subprocesos en Windows
-
06-07-2019 - |
Pregunta
Necesito tener comunicación bidireccional entre subprocesos en Tcl y todo lo que puedo obtener es una vía con parámetros que pasan como mi único canal de comunicación maestro y ayudante. Esto es lo que tengo:
proc ExecProgram { command } {
if { [catch {open "| $command" RDWR} fd ] } {
#
# Failed, return error indication
#
error "$fd"
}
}
Para llamar al tclsh83, por ejemplo ExecProgram " tclsh83 testCases.tcl TestCase_01 "
Dentro del archivo testCases.tcl puedo usar la información que se pasa. Por ejemplo:
set myTestCase [lindex $argv 0]
Dentro de testCases.tcl puedo poner en marcha:
puts "$myTestCase"
flush stdout
Y reciba eso que se coloca dentro del hilo maestro utilizando el ID de proceso:
gets $app line
... dentro de un bucle.
Lo cual no es muy bueno. Y no de dos vías.
¿Alguien sabe de un método de comunicación bidireccional fácil para tcl en Windows entre 2 hilos?
Solución
Aquí hay un pequeño ejemplo que muestra cómo dos procesos pueden comunicarse. Primero fuera del proceso secundario (guárdelo como child.tcl):
gets stdin line
puts [string toupper $line]
y luego el proceso padre que inicia al niño y se comunica con él:
set fd [open "| tclsh child.tcl" r+]
puts $fd "This is a test"
flush $fd
gets $fd line
puts $line
El padre utiliza el valor devuelto por open para enviar y recibir datos hacia / desde el proceso hijo; el parámetro r + para abrir abre la canalización tanto para lectura como para escritura.
La descarga es necesaria debido al almacenamiento en búfer en la tubería; es posible cambiar esto a almacenamiento en línea usando el comando fconfigure.
Solo otro punto; mirando su código, no está usando hilos aquí, está comenzando un proceso secundario. Tcl tiene una extensión de subprocesos que permite comunicaciones entre subprocesos adecuadas.