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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top