なぜかWM_DEVICECHANGEメッセージが来ない

解決


junjun  2012-07-11 17:12:56  No: 73456  IP: 192.*.*.*

#先に、、、、
#うまく説明出来なくて申し訳無いです。

USB(USB-RS232C変換)を抜いた時にポートを閉じたいのですが、、、
Comでのデータ転送中にUSBを抜いた場合、なぜかWM_DEVICECHANGE
が来ない時があります。

送受信中は、排他処理をかけていたりするので、それによって
メッセージが飛んで来ないことってありますか?

ちなみに、DLL内にてCreateDialogを生成して、それのCallBackで
メッセージ処理を行なっています。

DialogのInstanceはDllMainのモジュールハンドルを指定。
ウィンドウハンドルはGetDesktopWindow()を使っています。

アドバイスがあれば教えていただきたいです。
(解析の仕方とか、、、、、)
申し訳有りませんが、宜しくお願いします。

編集 削除
オショウ  2012-07-11 17:23:03  No: 73457  IP: 192.*.*.*

その変換アダプタのメーカーは?
出来の悪いメーカーのドライバーは、そういうことあります。

※  もしくは、デバイスがロックされているので、解放される
    まで送信されない・・・とか?
    卵が先か、ニワトリが先か・・・なんて状態ですネ!

※  タイムアウト設定があるならば、それまで待てば出ませんか?

以上。参考まで

編集 削除
junjun  2012-07-11 18:21:47  No: 73458  IP: 192.*.*.*

いつも回答ありがとうございます。

そうなんですよね。
鶏卵なんですよ。

タイムアウトまで待ちたいのですが、、、、
その間に再度接続されてしまうと、おかしな状態に
なると思われるので、、、、、
(テポート解放前に抜き差しすると、もう一度抜き差しが必要)

変換アダプタ、、、というか、機器なんです。テトテュチテヘで接続と
あったと思います。(相手はフですね)

送信は、チが変えるまでの待ちなので、オ秒程度(もう少し削れるかも?)
なのですが、受信は相手の処理次第なので、長い可能性が大なのです。

なので、なんとかトナヨノテナテネチホヌナのメッセージでと思ったのですが、、、、
同じトフフ内でやることが難しいのでしょうか?
スススススススススススススススススススススススススススススススススススススススス
ニコ オショウ
トコ イーアイッーキッアアィ水ゥ イーコウケコエク  書込者ノト:ロ 」 。ヲ   ン

では・・・
メホヲサチミノヲサでご自身でデバイスの監視を行って
みたら如何でしょうか?

※  少々難しいけど、一旦完成すれば転用は思いのまま・・・
    因みに私はアプリ側で監視するルーチンを使わずに
    システムサービスに監視機能を持たせ、アプリ側と
    の連携で情報伝達させます。

    権限的にもシステムサービスで監視させた方が、ヨ
    以降なら監視の為の権限設定が楽なので・・・

※  英語圏で探せばサンプルコードもすぐに見つかるヨ!

以上。参考まで
スススススススススススススススススススススススススススススススススススススススス
ニコ オショウ
トコ イーアイッーキッアアィ水ゥ イイコオクコオア  書込者ノト:ロ 」 。ヲ   ン

オオ〜大変なミス・・・

メトホヲサでした。

コッッョョッュッッエイケアキウョ

以上。・・・
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアイッーキッアイィ木ゥ イアコイウコオオ シ  スュアセシ初心者セ シッニセシノヘヌ ス「コッッョョョッッアョ「 ス「ー「セ 書込者ノト:ロ 」 ァマム「」「ネ ]

RegisterDeviceNotification で探してみます。
さらっと見た感じでは、いずれもDEVICECHANGEメッセージを待っているようなので、、、、、、別Appでデバイス監視なのかな・・?

DLL内で生成しているDialogはモードレスなので、影響しないと
思っていたのですが、、、、、
やはりDLL内でメッセージを止める何かが要るんでしょうね。

処理が多い状態だと、メッセージを受け取れないこともあるのでしょうか?_

編集 削除
junjun  2012-07-12 21:36:11  No: 73459  IP: 192.*.*.*

どうやら犯人は僕らしい・・・・orz

USBからのデータを取得処理部分をTimeOutまでWhileで回している部分で、
メッセージに対する処理が含まれていないことが要因ぽいです。

そのループ内に

MSG msg;
while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
{
  TranslateMessage (&msg);
  DispatchMessage (&msg);
}

を追加で改善出来そうです。

案を出して頂きましたが、自分の不備で申し訳無いです。


ちなみにですが、、、、
m_hPnPWindowHandle = CreateDialog( g_hInstance, MAKEINTRESOURCE(IDD_PNP), GetDesktopWindow(), (DLGPROC)DlgProcMain );

これでDialogを生成しています。
hInstanceはDllMainの第一引数になります。
この場合もDLLの関数内で処理の軽いループ(と言う表現がよいのか?)
を行うと、このDialogにも影響するのでしょうか?
実際にしているので、するんでしょうが、、、、、、
僕のイメージは、モードレスの場合には、影響しないと思っていました。

僕の勘違い?

編集 削除
オショウ  2012-07-13 02:25:29  No: 73460  IP: 192.*.*.*

同一プロセス内で、スレッドを生成しない状態でそのような処理
を行うと、当然、メッセージループは回りません。

通信の方は非同期処理(マルチスレッド化)してやれば、本体側
のメッセージループには影響が低くなるはずです。

ただ、CPUパワーを食うほど負荷をかければ、メッセージルー
プは回りにくくなりますので、程度問題です。

以上。参考まで

編集 削除
junjun  2012-07-13 17:24:54  No: 73461  IP: 192.*.*.*

ありがとうございました。

そうですね。どの処理をマルチスレッドにするのかを決め方が
しっかり出来ていなかったのが要因ですね。

全体を見直す必要があるかも、、、、、がんばります。

いつも協力していただきありがとうございます!
非常に助かりましたです  m(__)m

・・・また、宜しくお願いします。。。

編集 削除