如何在 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
这样,您的脚本就根本不需要 运行。您可以设置一个工具栏按钮、菜单项甚至是一个对话框来启动另一个脚本,这反过来会停止核心并删除断点。
我创建了一个 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
这样,您的脚本就根本不需要 运行。您可以设置一个工具栏按钮、菜单项甚至是一个对话框来启动另一个脚本,这反过来会停止核心并删除断点。