User interface 检测TCL脚本中TCL后台进程的结束

User interface 检测TCL脚本中TCL后台进程的结束,user-interface,exec,tcl,background-process,User Interface,Exec,Tcl,Background Process,我正在开发一个程序,该程序使用EXEC命令运行生成文件。这可能需要很长时间,所以我想把它放在后台,这样GUI就不会锁定。但是,我还希望禁用GUI,并且仅在编译make文件时运行进度条 那么,我如何在TCL中检测后台进程何时完成 编辑:它变得更加复杂,因为我的老板希望命令窗口保持打开(或可见),以便用户可以查看制作的进度,并查看是否出错 顺便问一下,计算线程会更容易吗?我需要一些方法来防止GUI锁定(防止不响应)。' 编辑:GUI是用TK制作的。 我认为TK是单线程的,这导致了问题。或者它可能默认

我正在开发一个程序,该程序使用EXEC命令运行生成文件。这可能需要很长时间,所以我想把它放在后台,这样GUI就不会锁定。但是,我还希望禁用GUI,并且仅在编译make文件时运行进度条

那么,我如何在TCL中检测后台进程何时完成

编辑:它变得更加复杂,因为我的老板希望命令窗口保持打开(或可见),以便用户可以查看制作的进度,并查看是否出错

顺便问一下,计算线程会更容易吗?我需要一些方法来防止GUI锁定(防止不响应)。'

编辑:GUI是用TK制作的。
我认为TK是单线程的,这导致了问题。或者它可能默认为单线程,我想将其设置为多线程。

您想在管道中运行make进程,并使用事件循环和fileevent来监视其进度(请参阅)


我不确定在Tk的事件循环中使用
vwait
。也许专家会帮我解决这个问题。

正如@glenn jackman所指出的,首选使用fileevent(因为它应该在任何地方都能工作)

将此调用为
bgexec job\u done cmd/c start/wait cmd/c make all
job_done
在命令完成后通过命令的输出被调用

也可以使用线程来实现这一点,但这需要线程化的tcl构建(现在对于AFAIK的所有平台都是默认的,但是旧版本的tcl esp在unix下默认不构建线程化的tcl)和
Thread
包(默认包含)。将其与线程一起使用的方法是:

thread::create "[list exec cmd /c start /wait cmd /c make all-all];[list thread::send [thread::id] {callback code}];thread::exit"
如果您需要定期调用它,那么只使用一个辅助线程而不是为每个作业创建一个新的辅助线程可能是值得的

编辑:添加
/wait
作为启动参数,以保持第一个cmd运行

cmd /c start /wait cmd /c make all-all

我应该用open吗?这不是我的程序,所以我不确定我应该改变太多(我只是被要求解除锁定)。exec命令是:“exec cmd/c start cmd/c make all&”,那么open会是什么呢?我想我只是想说我真的不知道两者之间的区别。
open“| cmd/c start cmd/c make all”r
。在Tk中,您不需要vwait,因为Tk已经将事件循环用于button clicked之类的事件;你可能会被嵌套的事件循环弄得非常混乱(你需要注意正确处理应用程序终止,以及其他一些事情)。重写代码,以处理回调中关闭后发生的事情;这很容易与事件循环一起工作。因此,我可以执行类似于
bgexec[set makeFinish 1]cmd/c start/wait cmd/c make all
和“监视”makeFinish是否更改为1?
bgexec{set makeFinish 1}cmd/c start/wait cmd/c make all
(注意
[]
将直接执行该命令)然后观看(但观看通常是通过
vwait
-在Tk中不是一个好主意)或调用其他一些更新Ui的过程。是否有任何方法可以捕获此后台进程中的错误?如果您提前关闭命令窗口,则程序不会知道它已停止。即使后台进程选择在退出前关闭stdout(
fclose(1)
),此操作是否有效?
thread::create "[list exec cmd /c start /wait cmd /c make all-all];[list thread::send [thread::id] {callback code}];thread::exit"
cmd /c start /wait cmd /c make all-all