【问题标题】:Parallel processing through tcl script通过 tcl 脚本进行并行处理
【发布时间】:2017-09-06 12:07:22
【问题描述】:

需要在 tcl (windows) 中进行并行处理的解决方案。

我尝试了线程,仍然无法获得所需的输出。

为了简化我的要求,我举一个简单的例子如下。 要求: 我想在不影响我当前执行流程的情况下运行 notepad.exe。从主线程控制应该转到被调用线程,启动notepad.exe并返回主线程而不关闭记事本。

尝试过:(Tcl 脚本)

包需要线程

设置 10

proc test_thread {b} {

puts "in procedure $b"
set tid [thread::create] ;# Create a thread
return $tid

}

放置“主线程”

放置 [thread::id]

设置 ttid [test_thread $a]

thread::send $ttid {exec c:/windows/system32/notepad.exe &}

把“结束”

获取输出: 运行记事本而不显示任何日志。 关闭记事本应用程序时,我得到以下输出。

主线程

tid0000000000001214

在程序 10 中

结束

期望的输出: 主线程

tid0000000000001214

在程序 10 中

---->> 控制应该转到线程并运行notepad.exe而不影响主线程流。

所以请帮助解决这个问题,如果除了线程概念之外还有其他问题,请告诉我。

【问题讨论】:

    标签: multithreading tcl


    【解决方案1】:

    您正在使用同步 thread::send。当您想要取回一个值时,这是最方便的版本,但它确实会等待。您可能应该使用 异步 版本:

    thread::send -async $ttid {exec c:/windows/system32/notepad.exe &}
    #            ^^^^^^ This flag here is what you need to add
    

    但是,exec 调用的行为与您所描述的完全一样,这很奇怪; & 最后 无论如何都应该使它有效地异步。除非在这种情况下,Windows 解释异步子进程创建的方式存在某种令人讨厌的交互。

    【讨论】:

    • 您可能应该使用异步版本
    • 谢谢你可能应该使用异步版本我可以知道哪个版本的tcl是异步的。我尝试使用 -async 选项,但它不允许启动记事本应用程序。我正在使用 tcl 8.6。如果您有任何其他方法可以解决此问题,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    相关资源
    最近更新 更多