如何在 PRACTICE 脚本循环 运行(并阻止)执行时在劳特巴赫使用 AddMenu?

How to use AddMenu in Lauterbach while a PRACTICE script loop is running(and blocking) execution?

我创建了一个 PRACTICE Lauterbach 脚本,以便在不同情况下从缓冲区中检索某些字符串。

我在检索缓冲区的不同位置放置了 4 个断点。

我想以非阻塞方式检索信息,就好像它是一个中断服务程序一样。为此,我使用了GLOBALON命令,如下:

            GLOBALON PBREAK GOSUB BB_HIT_CALLBACK

在 BB_HIT_CALLBACK 中,我为 4 个断点中的每一个都插入了服务例程。

            BB_HIT_CALLBACK:
                IF (sYmbol.EXIST(BREAK_LABEL1))
                 (
                     IF (REGISTER(pc)==ADDRESS.offset(BREAK_LABEL1))
                     (
                         GOSUB ISR1

                     )
                 )  
                IF (sYmbol.EXIST(BREAK_LABEL2))
                 (
                     IF (REGISTER(pc)==ADDRESS.offset(BREAK_LABEL2))
                     (
                         GOSUB ISR1

                     )
                 )  
                IF (sYmbol.EXIST(BREAK_LABEL3))
                 (
                     IF (REGISTER(pc)==ADDRESS.offset(BREAK_LABEL3))
                     (
                         GOSUB ISR1

                     )
                 )  
                IF (sYmbol.EXIST(BREAK_LABEL4))
                 (
                     IF (REGISTER(pc)==ADDRESS.offset(BREAK_LABEL4))
                     (
                         GOSUB ISR1

                     )
                 )  
            RETURN

另一方面,在正常执行中,我放置了一个简单的无限循环。

                WHILE TRUE()
                (
                    If (!STATE.RUN())
                    (
                      Go
                    )
                )

                ENDDO

这使程序处于循环状态,只能通过 GLOBALON PBREAK 命令中断。我希望能够有一个工具栏按钮来结束这个循环的执行,但是当 运行 时,脚本只响应断点,并且 UI 元素被忽略。

如何从 UI 元素停止循环的执行?

我已经能够设置读取秒数和 60 秒超时,但这对我想要的来说还不够好。

听起来 GLOBALON PBREAK 不是您问题的最佳解决方案。

您可以使用命令断点在遇到每个断点时直接执行任何 PRACTICE 命令或脚本:

Break.Set BREAK_LABEL1 /CMD "DO your_script.cmm ISR1"
Break.Set BREAK_LABEL2 /CMD "DO your_script.cmm ISR2"
Break.Set BREAK_LABEL3 /CMD "DO your_script.cmm ISR3"
Break.Set BREAK_LABEL4 /CMD "DO your_script.cmm ISR4"

如果单击“高级”按钮,Break.Set 对话框也可以做到这一点。

使用此设置,your_script.cmm 可能如下所示:

PRIVATE &arg
ENTRY &arg

IF "&arg"!=""
(
    GOSUB &arg
)
ELSE
(
    // script called without arguments -- maybe set the breakpoints here
)

ENDDO

ISR1:
    PRINT "ISR1 reached!"

    // resume execution of core
    Go.direct
    RETURN

// and so on for ISR2 to ISR4

这样,您的脚本就根本不需要 运行。您可以设置一个工具栏按钮、菜单项甚至是一个对话框来启动另一个脚本,这反过来会停止核心并删除断点。