Tcl 防止在执行某些代码部分之前重复调用proc

Tcl 防止在执行某些代码部分之前重复调用proc,tcl,scriptcontrol,Tcl,Scriptcontrol,我有一个用于测试自动化的tcl脚本(带有汽车制造商ScriptControl接口) 在这个脚本中,我调用了一个proc,其中执行的一些代码可能需要几毫秒才能返回。但是,如果在此过程中的某一点再次调用它,则第二次调用将失败并导致错误 我无法控制何时调用proc,因为调用来自另一个应用程序。我正在寻找的是一种防止在执行代码的某一部分时对函数进行并行调用的方法 大概是这样的: proc MyProc {args} { #Execute Code set val 0 #---t

我有一个用于测试自动化的tcl脚本(带有汽车制造商ScriptControl接口)

在这个脚本中,我调用了一个proc,其中执行的一些代码可能需要几毫秒才能返回。但是,如果在此过程中的某一点再次调用它,则第二次调用将失败并导致错误

我无法控制何时调用proc,因为调用来自另一个应用程序。我正在寻找的是一种防止在执行代码的某一部分时对函数进行并行调用的方法

大概是这样的:

proc MyProc {args} {
    #Execute Code
    set val 0

    #---this part should not be interrupt
    #Execute non interrupt Code
    RegisterQuantities ($names)
    Foreach name {
        ReadQuantity $name
    }
    #------------------------------------

    return val
}

调用来自一台实时PC,该PC最简单的方法是创建一个全局变量,该变量表示代码是否已达到调用过程的有效点:

variable ready_for_call 0

proc ReadyForCall {} {
    variable ready_for_call
    set ready_for_call 1
}

proc MyProc {args} {
    variable ready_for_call
    if {!$ready_for_call} {
        # I don't know if you want a warning, or an error, or silent ignoring
        puts stderr "WARNING: called MyProc too early"
        # You might need to return a dummy value here; the default is an empty string
        return
    }
    #Execute Code
    ...
}

然后,您需要做的就是在命令变得可调用时调用
ReadyForCall

您需要更具体一些:长流程调用到底是什么
exec
'ing某处,一个C实现的Tcl命令?在同一个脚本执行中,您的重新进入问题不会发生(脚本只会阻塞多长时间)。或者,如果
long\u进程
调用在某种程度上是非阻塞的(根据您的描述,它不是)。只有当整个脚本作为不同的第二个进程执行时才会发生这种情况(一个
tclsh
脚本的执行被同一个脚本的第二个进程超过)。如果是这种情况,Donal的回答不会有帮助(在一个脚本执行之外看不到模式变量)。我对代码进行了预处理,以更好地显示操作系统发生了什么。调用来自在实时环境中运行的模拟。proc注册要从中读取的值,然后在循环中读取这些值。如果在注册和读取secon之间出现第二个调用,则对Regisster的调用将失败,并且我在尝试读取它们时出错。第二次调用返回后,第一次调用继续并完成,但没有出现错误。缺少的部分是对
MyProc
的调用是如何确切地存在的?脚本及其proc是如何准确执行的?我知道你提到了
汽车制造商
及其
脚本控制
,但除非有人了解
汽车制造商
内部工作的背景信息(没有购买该产品的可用文档),否则我们谁也帮不上忙。谢谢你的回答。我将使用它来显示更有意义的错误消息,以便测试人员知道发生了什么。不幸的是,它仍然打破了测试