代码之家  ›  专栏  ›  技术社区  ›  August Karlstrom

在GUI事件之间等待

  •  0
  • August Karlstrom  · 技术社区  · 6 年前

    我正在尝试为DyalogAPL中的图形组件编写一个测试,它将模拟打开新窗口的按钮单击和用于填写表单字段的按键。我的第一个方法是简单地为排队事件编写一个nq语句序列:

    ⎕NQ '#.foo.barButton' 'Select'   ⍝ open window
    ⎕NQ '#.foo.bar.bazTab' 'Select'  ⍝ select tab in opened window
    ....
    

    然而,问题在于,如果目标对象尚未显示(例如,打开窗口时),则_nq失败:

    VALUE ERROR: The event contains an invalid object or event name
    

    我试着在nq语句之间插入几秒钟的停顿,但由于执行是同步的,所以这没有任何区别。

    我应该采取什么方法?

    2 回复  |  直到 6 年前
        1
  •  2
  •   John Daintree    6 年前

    这里的问题是,一个单nq“向内部队列发送”消息。当您“nq”第二条消息时,第一条消息尚未处理,因此目标对象尚未创建。使用1到nq的左参数,它将“发送”消息到对象,而不是“发布”消息。

    ⎕NQ documentation

    在我的机器上,我完成了以下操作:

    '⎕se.mb.jd' ⎕wc 'MenuItem' 'jd' ('event' 'select' 'jd')
    

    我有一个功能JD:

    ∇jd a
    [1]   'f'⎕WC'form'
    ∇
    

    以及一个函数foo:

    ∇foo
    [1]   1 ⎕NQ'⎕se.mb.jd' 'select'
    [2]    ⎕DL 5
    [3]   'done'
    ∇
    

    当我运行foo时,窗口立即弹出,然后有5秒钟的延迟,我在会话中看到结束。

    你能试试吗?然后我们来看看你在做什么。

        2
  •  0
  •   August Karlstrom    6 年前

    如果异步调用测试函数(使用产卵运算符“&”),则延迟将按预期工作:

    ∇ Test dummy
        ⎕NQ '#.foo.barButton' 'Select'   ⍝ open window
        ⎕NQ '#.foo.bar.bazTab' 'Select'  ⍝ select tab in opened window
        ....
    ∇
    
    Test& 0