38.9.5.6 禁止两次调用API

API两次调用

WinGP SDK禁止在调用一个寄存器访问API的过程中调用另外一个寄存器访问API(两次调用)。但是,寄存器访问API正在运行API中的消息泵,如果事件发生,用户程序会启动。

在消息处理过程中,当调用API时可能发生两次调用。

下面描述一种导致两次调用的情况:

  1. 按两个按钮导致两次调用
    有A和B两个按钮。如果按A,将调用设备读取API。如果按B,将调用设备写入API。
    在这种情况下,如果您在按A按钮调用设备读取API的同时按B按钮,则寄存器写入API也被调用,从而导致API两次调用而发生错误。

  2. 使用定时器时的两次调用
    定时器事件常用于Windows程序的循环处理。 对那些使用定时器事件的程序需要谨慎编程,否则,可能导致API两次调用。
    使用定时器事件时如下情形会造成错误。
     

    1. 每秒进行一次调用、读取、显示寄存器读取API。

    2. 按下按钮会调用寄存器写入API ,将数值写入寄存器中。

    在由1)中的定时器事件触发的读取过程中,2)按钮被按下,2)处理开始。
    在2)的写入过程中,定时器事件发生,执行1)的读取。

避免API两次调用的方法

下面给出避免API两次调用的方法。

  1. 在用户程序中,改进算法来防止API两次调用。
    例如,

  1. 不要允许在API中进行消息处理
    用参数2调用EasySetWaitType()。在这种情况下,造成两次调用的其他消息也不被处理,否则可能会导致一些其他问题,如应用程序执行意外操作。