Запрет повторного вызова proc до выполнения определенной части кода - PullRequest
0 голосов
/ 05 июня 2019

у меня есть скрипт tcl, используемый для автоматизации тестирования (с интерфейсом CarMaker ScriptControl)

В сценарии я вызываю процедуру, где выполняется некоторый код, который может занять несколько миллисекунд, прежде чем он вернется. Однако если в определенный момент этого процесса он будет вызван снова, второй вызов завершится ошибкой и приведет к ошибке.

У меня нет контроля над тем, когда будет вызываться 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
}

Звонки поступают с ПК реального времени, который

1 Ответ

1 голос
/ 05 июня 2019

Самый простой способ сделать это - создать глобальную переменную, которая сообщает, достиг ли код точки, в которой процедура может быть с пользой вызвана:

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 в точке, где команда становится вызываемой (что вы, вероятно, можете охарактеризовать довольно хорошо).

...