API二重読み出し
WinGP SDKは、1つのデバイスアクセスAPIを呼び出し中にさらに別のデバイスアクセスAPIを呼び出すことを (二重呼び出し)禁止しています。しかし、デバイスアクセスAPIは、API内でメッセージポンプを動かしていますので、イベントが発生すればユーザプログラムが動き出します。
メッセージの処理ルーチンの中で、APIを呼び出すと二重呼び出しが発生することがあります。
二重呼び出しになる事例を以下に示します。
2つのボタンを押すことによる二重呼び出し
2つのボタンAとBがあり、Aが押されるとデバイスのリードAPIを呼び出し、Bが押されるとデバイスのライトAPIを呼び出すとします。
この場合、Aのボタンを押しデバイスのリードAPIを呼び出している最中にBのボタンを押すとデバイスのライトAPIが呼ばれ、その時点でAPIの二重呼び出しとなり、エラーとなります。
タイマーによる二重呼び出し
Windowsのプログラムで周期的な処理を行う場合、よくタイマーイベントを利用しますが、タイマーイベントを利用するプログラムでは、気を付けてプログラムしないと、APIを二重に呼び出してしまうことがあります。
このようなプログラムは、以下のようなタイミングの場合、エラーになります。
1秒に1回、周期的にデバイスリードAPIを呼び出しデバイスをリードし、それを表示する
あるボタンが押されるとデバイスライトAPIを呼び出し、デバイスに値を書き込む
1)のタイマーイベントが発生してリード中に、2)のボタンを押し、2)の処理が動き出したとき
2)のライト中にタイマーイベントが発生し、1)のリードを行うとき
APIの二重呼び出しの回避策
APIの二重呼び出しの回避策には、以下のような方法があります。
ユーザプログラムでAPIの二重呼び出しを行わないように、アルゴリズムを改良する。
例えば、
タイマー処理ルーチンおよびボタンの処理ルーチンの先頭で、必ずタイマーのキャンセルを行う。
1つのボタンが押されて処理をしている間は、そのボタンや別のボタンが押されても無視するようにする。
API内でメッセージ処理をしないようにする
EasySetWaitType()を引数2でコールする。ただし、この場合二重呼び出しの元となるメッセージ以外もメッセージについて処理されないので、アプリケーションが意図しない動作を行うなど他の問題が発生することがあります。