从线程设置TCL vwait变量

时间:2013-02-12 01:19:40

标签: multithreading tcl visa

我需要能够设置变量以从线程内部结束vwait。这是因为我有一个循环,通常会锁定interperator,因此它会运行任何GUI,直到它完成。

我希望它像这样的睡眠命令一样运行:

global EndSleep
after ${SleepTime_ms} set EndSleep 1
vwait EndSleep

只有在查询设备的while循环退出时才需要设置vwait变量。

这是我目前的代码:

    proc ::VISA::Wait {VisaAlias} {
    # Link global variable
    global EndWait

    # Execute commands in a thread so the GUI is not locked while executing
    set Thread [thread::create]
    thread::send ${Thread} [list set VisaAlias ${VisaAlias}]
    thread::send ${Thread} {
        source MolexVisa.tcl

        # Temporarily make new connection with device
        VISA::Connect ${VisaAlias}

        # Query operation complete bit
        VISA::Query ${VisaAlias} "*OPC?"

        # Continue to attempt to read OPC bit until any response is given; typically 1
        while {[string equal [VISA::Read ${VisaAlias}] ""]} {}

        # Destroy temporary connection
        VISA::Disconnect ${VisaAlias}

        # Set vwait variable
        set EndWait 1
    }

    # Wait for thread to end
    vwait EndWait

    # Mark thread for termination
    thread::release ${Thread}
}

目前线程仍在冻结GUI。另外,由于线程中的变量和我期望的变量不一样,显然它只是永远等待。

感谢任何建议或帮助。我相信我已经用尽所有其他更实际的方法来完成任务,但欢迎更多的见解。

1 个答案:

答案 0 :(得分:2)

使用-async的{​​{1}}标记。默认情况下,thread::send会一直阻塞,直到脚本执行完为止(这大部分时间都会使用线程失败)。

如果您使用::thread::send标志,您还可以使用-asyncthread::send的可选变量参数,例如。

vwait

这可以防止GUI冻结。 请注意,斐波那契的这种实现并不是最好的,并且是“一些昂贵的计算”的占位符。