- - PR -
シリアル通信の同期処理に関して
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2003-07-14 16:21
APIを使ったシリアル通信の処理を組んでいます。
「WaitCommEvent」 なる物を使ってイベントが発生した時だけデータの 読み書き処理を行うスレッドを作りました。 一応読み書きはできたのですが、 アプリを終了しようとするとなぜかフリーズしてしまうんです。 「同期処理」を組んでいますので、「WaitCommEvent」は何らかのイベントが 発生するまでずっと待ちつづけますよね? その状態でポートをクローズしてアプリを終了しようとしているから 問題が発生していると思うのですが(違うかな?)、 過去に似たような問題が発生した方、いらっしゃいますでしょうか? もしいらしたらご教授願いたく。 「formatMessage」なんかを使えば何らかの情報を得られると 思うのですが、当方、まだそこまで知識を身に付けておらず・・・。 よろしくお願いいたします(__) |
|
投稿日時: 2003-07-16 12:57
ポートのクローズ前に、SetCommMaskして、
WaitCommEventを終了させてみてはいかがでしょう? 詳しくは、WaitCommEventのリファレンスをご参照ください。 |
|
投稿日時: 2003-07-17 08:16
お返事有難う御座います。 >ポートのクローズ前に、SetCommMaskして、 >WaitCommEventを終了させてみてはいかがでしょう? >詳しくは、WaitCommEventのリファレンスをご参照ください。 そうなんです。これでいけると思ったんですよ。でも同期処理の場合、なぜかフリーズ してしまうんですよね。 色々と調べたところ、 http://support.microsoft.com/default.aspx?scid=kb;ja;105302 に書いてありました。 マイクロソフトは反省したり謝ったりする気は毛頭ないみたいですね・・・。 ちなみにwin98や95では同期処理でもフリーズすること無く動作するようです。 |
|
投稿日時: 2003-07-17 08:32
なるほど...たしかにだめなようですね。
回避策が書かれていない為、対処できないのでは? 案1.OVERLAPPEDにして、WaitForMultipleObjectでI/Oイベントと終了イベントを同時に待つ 案2.別スレッドから強制的にスレッドを停止する(おーこわいこわい) 案1を検討されてはいかがでしょうか? |
|
投稿日時: 2003-07-17 08:55
お返事ありがとうございます。 >案1.OVERLAPPEDにして、WaitForMultipleObjectでI/Oイベントと終了イベントを同時に待つ >案2.別スレッドから強制的にスレッドを停止する(おーこわいこわい) > >案1を検討されてはいかがでしょうか? 案2は一度試してみた事があるんですが、どうも駄目っぽいですね。うまく制御が戻らず、 メモリが開放されなくて。 案1に関しては、「WaitForMultipleObject」という物の存在を今初めて知りました(^^; なかなかよさげな機能ですが今回は時間の都合上、使用は見送りたく。 ショボイやり方ですが、非同期でタイマーイベントを発行させる方法で制御ラインを見るか、 バッファにデータが存在するか、ぐるぐる回るしかないかなと思っています。 一番やりたくない方法ですが。 |
|
投稿日時: 2003-07-17 19:33
> なかなかよさげな機能ですが今回は時間の都合上、使用は見送りたく。
ご参考までに。 MSDNライブラリ内にある、「Serial Communications in Win32」が大変参考になります。 英語ですが...プログラム例だけ見ても十分かなと思います。 |
|
投稿日時: 2003-07-18 08:40
お返事ありがとうございます。 >ご参考までに。 >MSDNライブラリ内にある、「Serial Communications in Win32」が大変参考になります。 >英語ですが...プログラム例だけ見ても十分かなと思います。 ほんとだ・・・見事なまでに全部英語ですね・・。 なんとか物にしたいんで、がんばってみますね。 ちなみに「Serial Communications in Win32」では以下のURLがヒットしました。 参考までに。 http://www.mtakahashi.com/old/04500.html |
|
投稿日時: 2003-07-18 12:22
URL先を確認しました。
MSDNライブラリのサンプルプログラムの方をお勧めします。 |