Multithreading 通过tcl脚本进行并行处理
需要在tcl(windows)中进行并行处理的解决方案 我尝试了线程,但仍然无法达到预期的输出 为了简化我的要求,我举了一个简单的例子如下。 要求: 我想运行notepad.exe而不影响当前的流执行。从主线程控制转到被调用的线程,启动notepad.exe并返回主线程而不关闭记事本 尝试:(Tcl脚本) 包需要线程 定一个10 proc test_线程{b}{Multithreading 通过tcl脚本进行并行处理,multithreading,tcl,Multithreading,Tcl,需要在tcl(windows)中进行并行处理的解决方案 我尝试了线程,但仍然无法达到预期的输出 为了简化我的要求,我举了一个简单的例子如下。 要求: 我想运行notepad.exe而不影响当前的流执行。从主线程控制转到被调用的线程,启动notepad.exe并返回主线程而不关闭记事本 尝试:(Tcl脚本) 包需要线程 定一个10 proc test_线程{b}{ puts "in procedure $b" set tid [thread::create] ;# Create a thread
puts "in procedure $b"
set tid [thread::create] ;# Create a thread
return $tid
}
放“主线”
放置[thread::id]
设置ttid[测试线程$a]
线程::发送$ttid{exec c:/windows/system32/notepad.exe&}
“结束”
获取输出:
运行记事本而不显示任何日志。
关闭记事本应用程序时,我得到以下输出
主线
tid0000000000001214
在程序10中
结束
所需输出:
主线
tid0000000000001214
在程序10中
---->>控件应转到线程并在不影响主线程流的情况下运行notepad.exe。
您正在使用同步
线程::send
。当您想要返回值时,它是最方便的版本,但它会等待。您可能应该使用异步版本:
然而,令人好奇的是,exec
调用的行为与您描述的完全一样;最后的&
应该使它有效地异步。除非在这种情况下,Windows解释异步子流程创建的方式存在某种令人讨厌的交互。您可能应该使用异步版本Tanks您可能应该使用异步版本我可以知道哪个版本的tcl用于异步。我尝试使用-async选项,但它不允许启动记事本应用程序。我使用的是TCL8.6。如果您有任何其他方法来解决这个问题,请让我知道。
thread::send -async $ttid {exec c:/windows/system32/notepad.exe &}
# ^^^^^^ This flag here is what you need to add