イベント処理が動かない場合がある

[戻る]
pon 2017/10/17(火) 08:10:24
すいません、不可解な不具合に遭遇してしまいましたのでお知恵をお貸しください。

■環境
VisualStudio2005 (VC++)
OS: XP(32Bit) or 7(32Bit)

■処理内容
メイン処理は、(CreateEvent後)ハードウエアに処理をスタートさせて
WaitForSingleObjectにて待機。
ハードは処理完了したら割り込みが来ますので、その割り込みハンドラ内で
OpenEvent
SetEvent
をコールして、待機中のメイン処理を再開させる処理です。
(割り込みハンドラが起動してSetEventをコールするまではほぼ処理時間1ms以下)

おそらくイベント処理の見本のようなコードだと思います。
これらの動きを1秒間に4回ほど行います。

■現象
上記処理は、WindowsXPのときは問題なく動いていたのですが、Windows7になってから、
ごくごく稀に(2〜3時間に1回の頻度)OpenEventの処理で数秒(最大8秒)もかかる
場合があります。
当然、WaitForSingleObjectはタイムアウトしてしまい、処理がエラーとなっています。

■質問
違うのはOSだけなのですが、XPから7になって、イベント処理などがおかしくなること
がありますでしょうか?
あるいは、回避方法、あるいは代替案などあれば教えてください。

ITO 2017/10/17(火) 11:50:35
1. ハードってFTDI等で、serial UARTで使う方法ですか?
2. それとは別に、デバイスドライバーから作ったのですか?

pon 2017/10/17(火) 22:06:22
ITOさん、返信ありがとうございます。

> 1. ハードってFTDI等で、serial UARTで使う方法ですか?

いわゆるキャプチャーカードによる画像取得です。キャプチャーカードの先にはカメラが
あり、Windowsアプリから提供されているデバイスドライバの関数をコールして画像を取り
り込みを開始させ、そのままWaitForSingleObjectに入ります。

撮像完了後、あらかじめ指定してあるWindowsアプリ側のコールバック関数が起動し、そ
の中に入っているOpenEvent、SetEventがコールされ、待機しているaitForSingleObjectが
が解除される、、、というしくみです。

カメラリンクのカメラで、UARTの機能は確かに入っていますが、撮像するときは特にUART通信
通信をしていません。

> 2. それとは別に、デバイスドライバーから作ったのですか?

デバイスドライバは作ってはいません。XPからのものをそのまま7で使っています。

■追加情報
試しに少しいじっていたら挙動が代わり、今度はCreateEventが時間がかかるようになり
ました。どうもOS自体が停止する?ような感触です、、、

ITO 2017/10/18(水) 16:17:05
>デバイスドライバは作ってはいません。XPからのものをそのまま7で使っています。
windows7用のはないですか?バ-ジョンアップする必要があると思います。

>VisualStudio2005 (VC++)
2010以降に変えなければいけないかも知れませんね。

一度、メーカに相談されるのがいいと思います。

pon 2017/10/19(木) 08:11:31
ITOさん、書き込みありがとうございます。

> windows7用のはないですか?バ-ジョンアップする必要があると思います。

デバイスドライバは、実は市販品ではないのですが、
それを作った人間は既に退職してしまいました。。。
WinDDKで作ったと思われますが、XP用と7用ではやはり違うのでしょうか?

> 2010以降に変えなければいけないかも知れませんね。

これはそうかもしれませんね。検討してみます。

ITO 2017/10/19(木) 09:23:24
>WinDDKで作ったと思われますが、XP用と7用ではやはり違うのでしょうか?
WINDDK → WDKと名称も変わっています。

https://msdn.microsoft.com/ja-jp/library/windows/hardware/ff557573(v=vs.85).aspx

ITO 2017/10/19(木) 20:36:28
追記、
 自作のUSBドライバーは動作しましたね、何か違いかあるのかも知れませんね。

仲澤@失業者 2017/10/20(金) 10:41:07
OpenEvent()は複数のプロセスが同じイベントハンドルを
共有するために行うものなので、CreateEvent()された全てのイベントについて、
イベント名称をキーに検索が走ります。
つまり、準備段階処理に相当するわけで、事象が発生してから行うものではありません。

この辺りの認識は万全でしょうか。

pon 2017/10/24(火) 15:10:43
[[解決]]
ITOさん、仲澤さん

コメントありがとうございます。
使い方が間違っているのでしょうか、、再度、確認してみます。

また追加情報ですが、停止しているのは確かなのですが、どうも自分のアプリケーション
だけでないようで、他のアプリケーションも、当該時間、停止していることがわかりまし
た。

なので、WindowsOSのタスク遷移的なものの要因か、WindowsOS自体の問題なのかもしれま
せん。

ともあれ、イベント処理云々の話ではなさそうなので、一旦、ここでスレ終了とします。

どうもお付き合いいただき、ありがとうございました。

古いスレッドには追加発言できません。