API两次调用
WinGP SDK禁止在调用一个寄存器访问API的过程中调用另外一个寄存器访问API(两次调用)。但是,寄存器访问API正在运行API中的消息泵,如果事件发生,用户程序会启动。
在消息处理过程中,当调用API时可能发生两次调用。
下面描述一种导致两次调用的情况:
按两个按钮导致两次调用
有A和B两个按钮。如果按A,将调用设备读取API。如果按B,将调用设备写入API。
在这种情况下,如果您在按A按钮调用设备读取API的同时按B按钮,则寄存器写入API也被调用,从而导致API两次调用而发生错误。
使用定时器时的两次调用
定时器事件常用于Windows程序的循环处理。 对那些使用定时器事件的程序需要谨慎编程,否则,可能导致API两次调用。
使用定时器事件时如下情形会造成错误。
每秒进行一次调用、读取、显示寄存器读取API。
按下按钮会调用寄存器写入API ,将数值写入寄存器中。
在由1)中的定时器事件触发的读取过程中,2)按钮被按下,2)处理开始。
在2)的写入过程中,定时器事件发生,执行1)的读取。
避免API两次调用的方法
下面给出避免API两次调用的方法。
在用户程序中,改进算法来防止API两次调用。
例如,
在启动定时器处理程序和按钮处理程序时总是取消定时器。
在由按下1个按钮触发的处理过程中,忽略任何其他按钮的按下或该按钮的再次按下。
不要允许在API中进行消息处理
用参数2调用EasySetWaitType()。在这种情况下,造成两次调用的其他消息也不被处理,否则可能会导致一些其他问题,如应用程序执行意外操作。