【问题标题】:Prevent repeating call to proc before certain part of code is executed防止在执行某些部分代码之前重复调用 proc
【发布时间】:2019-10-20 19:16:39
【问题描述】:

我有一个用于测试自动化的 tcl 脚本(带有 CarMaker 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
}

电话来自实时电脑

【问题讨论】:

  • 你需要更具体一点:长进程调用到底是什么? exec'ing 在某处,一个 C 实现的 Tcl 命令?在同一个脚本执行中,您的重入问题不会发生(脚本只会阻塞多长时间)。或者,如果long_process 调用在某种程度上是非阻塞的(根据您的描述,它不是)。只有当整个脚本作为不同的第二个进程执行时才会发生这种情况(一个tclsh 执行的脚本被第二个相同的脚本所超越)。
  • 如果是这种情况,Donal 的回答将无济于事(模式变量在一次脚本执行后看不到)。
  • 我将代码更新为机器人,以更好地显示操作系统发生的情况。调用来自在实时环境中运行的模拟。proc 注册要从中读取的值,然后在循环中读取它们。如果在注册和读取之间进行第二次调用,则对 Registster 的第二次调用将失败,并且尝试读取它们时出现错误。在第二次调用返回第一次之后继续并完成 wothout 错误。
  • 缺少的部分是对MyProc 的调用究竟是如何产生的?带有 proc 的脚本是如何准确执行的?我知道您提到了CarMaker 及其ScriptControl,但除非有人对CarMaker 的内部工作有背景信息(没有购买该产品的可用文档),否则我们都不会能够提供帮助。

标签: tcl scriptcontrol


【解决方案1】:

执行此操作的最简单方法是创建一个全局变量,说明代码是否已到达可以有效调用过程的点:

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(你可以很好地描述它)。

【讨论】:

  • 感谢您的回答。我将使用它来显示更有意义的错误消息,以便测试人员知道发生了什么。不幸的是,它仍然打破了测试
猜你喜欢
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
相关资源
最近更新 更多