从 Tcl 中的工作线程打印诊断消息

问题描述 投票:0回答:1

我尝试开始尝试线程。现在这是一种(糟糕的)体验。我来到了这一点,我什至尝试了我可以在帮助页面甚至手册页上找到的任何示例。没有一个在工作,真的没有(在某种程度上只是下面的一个)。他们都什么都不做。但是,只要对手册页中的一个示例稍作改动(!),我就可以解决至少一个我遇到的问题:这是代码:

    package require Thread
        set t1 [thread::create]
        set t2 [thread::create]
        thread::send -async $t1 "set a 1 ; puts test1 " result
        thread::send -async $t2 "set b 2 ; puts test2" result
        for {set i 0} {$i < 2} {incr i} {
            vwait result
            puts $result
        }

这是手册页示例中的代码,仅进行了两次修改。首先,我必须把“包要求”放在那里。 第二个变化更有趣,因为我只是在两个线程中添加了两个“puts”。没有它,它就可以工作(是的,即使是所有微不足道的例子,也只有它运行了!)。使用 puts 我收到错误消息“找不到频道标准输出”。 这一点我什至可以理解,如果我能延伸得更远的话,线程甚至不在它自己的 interp und Variable 空间中,但即使在独立的库空间中也是如此。 但是,我对此表示怀疑,因为每个示例都在其线程代码中使用了 puts,为什么我不能使用它呢?所以,这似乎不是答案。 此外,这是示例,至少给了我一个错误。所有其他示例,即使来自她的站点,也什么都不做。从那时起,当涉及到“vwait”位置时,什么也没有发生,而每个人都希望至少有一些“puts”文本。

我在 Windows 10 下使用 Thread Lib 2.8.8 和 Active TCL(32 位和 64 位),iof 可能会有所帮助。 知道为什么我的设置反应明显与其他人如此不同吗? :) 提前致谢。

multithreading tcl
1个回答
0
投票

默认情况下不与工作线程共享任何资源,即使是标准通道也是如此。他们获得了自己的命令和变量副本,但通道根本不存在。您可以使用

thread::transfer
将频道move 到另一个线程(有一些限制),但标准频道通常根本无法移动。这意味着一个简单的
puts
会失败。

让工作线程将值返回给主线程。或者你甚至可以这样做:

# Assumes you've sent the main thread identity over
thread::send $mainThread [list puts $msg]
© www.soinside.com 2019 - 2024. All rights reserved.