私は現在 GUI を持っています。自動化 (expect を使用) の後、ユーザーは 10 個の telnet 接続の 1 つと対話できるようになります。相互作用は、次のループを使用して行われます。
#After selecting an item from the menu, this allows the user to interact with that process
proc processInteraction {whichVariable id id_list user_id} {
if {$whichVariable == 1} {
global firstDead
set killInteract $firstDead
} elseif {$whichVariable == 2} {
global secondDead
set killInteract $secondDead
}
global killed
set totalOutput ""
set outputText ""
#set killInteract 0
while {$killInteract == 0} {
set initialTrue 0
if {$whichVariable == 1} {
global firstDead
set killInteract $firstDead
} elseif {$whichVariable == 2} {
global secondDead
set killInteract $secondDead
}
puts "$id: $killInteract"
set spawn_id [lindex $id_list $id]
global global_outfile
interact {
-i $spawn_id
eof {
set outputText "\nProcess closed.\n"
lset deadList $id 1
puts $outputText
#disable the button
disableOption $id $numlcp
break
}
-re (.+) {
set outputText $interact_out(0,string)
append totalOutput $outputText
#-- never looks at the following string as a flag
send_user -- $outputText
#puts $killInteract
continue
}
timeout 1 {
puts "CONTINUE"
continue
}
}
}
puts "OUTSIDE"
if {$killInteract} {
puts "really killed in $id"
set killed 1
}
}
新しいプロセスが選択されると、前のプロセスは強制終了されます。以前は、ボタンをクリックすると、このループに再び入るだけでした。最終的に、while ループが終了せず、ボタンを 124 回押すとクラッシュする (stackoverflow =P) ことに気付きました。それらはバックグラウンドで実行されていませんが、スタック上にあります。processInteraction
そのため、新しいプロセスが開始されたときに関数内のループを強制終了する方法が必要でした。多くの失敗の後、解決策を試みた最後の試みは次のとおりです。
proc killInteractions {} {
#global killed
global killInteract
global first
global firstDead
global secondDead
global lastAssigned
#First interaction
if {$lastAssigned == 0} {
set firstDead 0
set secondDead 1
set lastAssigned 1
#firstDead was assigned last, kill the first process
} elseif {$lastAssigned == 1} {
set firstDead 1
set secondDead 0
set lastAssigned 2
vwait killed
#secondDead was assigned last, kill the second process
} elseif {$lastAssigned == 2} {
set secondDead 1
set firstDead 0
set lastAssigned 1
vwait killed
}
return $lastAssigned
}
killInteractions
ボタンが押されたときに呼び出されます。スクリプトがハングアップしvwait
ます。2 つの変数を持つプロセスを処理するためのコードが少し奇妙/不安定に見えることはわかっていますが、これはこれを機能させるための必死の最後の努力でした。
デッド シグナルが正しいプロセスに送信されます (secondDead
またはの形式でfirstDead
)。対話のタイムアウト値を 1 秒に設定しているためwhile
、ユーザーが telnet で接続されたセッションと対話している間でも、ループが true かどうかをチェックし続ける必要があります。dead シグナルが送信されると、プロセスが終了したことの確認を待ちます ( を介してvwait
)。
問題は、シグナルが送信されると、それを確認するためのコンテキストが与えられない限り、ループは終了する必要があることに決して気付かないことです。first
ループは、またはによって追い出されるまで実行する必要がありますsecondDead
。したがって、次のプロセスに切り替える前に何らかの形で待機する必要がありprocessInteraction
、前のプロセスのループインが制御できるようになります。
どんな助けでも大歓迎です。