紅皿のサポートブログ

キーボード配列エミュレーションソフトウェア「紅皿」の不具合や要望はこちらに

benizara ver.0.1.4.76 のリリース

 この記事のひとつ前とふたつ前で、不具合のログについてコメントを付けました。正常にキー・キューから文字が出力されたのち、何かのトリガーが発生すると、再びキー・キューから直前に出力した文字が出力されています。発生確率は低いけど、確実に発生しています。

 

 これは、とるさんから頂いたコメントと関係があるように思います。

 

http://ahkwiki.net/Critical
を読むと、「Criticalコマンドの使用中でもSleepコマンドでメッセージのチェックが行われる」であると考えられます。
出力時にSleep, 10を使うことで、もしかしたら紅皿の動作に支障が出るかもしれません。 

 

 benizara 0.1.4.7.3 では、キーオンのイベントやタイマーのイベントが発生すると、critical 文によって多重イベントの発生を抑止していますが、Sleep文を実行すると、critical文による他のイベントの抑止が効かなくなるようなのです。

 多重にイベントが発生すると、出力途中のキー・キューが多重に判定され、キー・キューが重複して出力されたりすることになろうかとおもいます。

 また、この推測は、大岡俊彦さんの不具合レポートにて、「CPUが遅いパソコンでは不具合が頻発し、速いパソコンでは不具合発生頻度が低くなる。」という症状とも整合します。

 これを回避するため、autohotkey の Sleep の代わりに、WindowsシステムコールによるSleepに書き換えました。この回避策は、多重イベントの発生を抑止する方法として、Autohotkeyのページにも掲載されています。

 なお、critical を実行すると、critical,offで解除して5mSECの待ち時間後にイベントが実行されるようです。そして、すぐさまイベントを実行したいときには、sleep,-1を実行するとよいことも掲載されていました。よって、イベント終了時には、critical,offの後にsleep,-1 を実行して、critical 文によって抑止されていた他のイベントがあれば、すぐさま実行されるようにいたしました。

 このような対策を行ったのが、benizara ver.0.1.4.76です。ご確認の上、不具合等がございましたら、ご連絡をお願いいたします。