mfc-ml

2001年07月

31

[mfc 33509] Re: WaitCommEvent のオーバーラップについて


> ここで期待通りにならないのは、アプリケーション終了時にth_event.SetEvent()を
> やっているにもかかわらず、
> ※1を実行しないため、※2も※3も実行せずに
> アプリケーションが終了してしまう点です。
> 通信している最中はちゃんと※1を実行します。
> WaitCommEvent()で処理が固まっている時はth_event.SetEvent()
> を検知できないのでしょうか。

サンプルプログラム TTY.C をご覧になれば
解決すると思いますが。
31

[mfc 33509] Re: WaitCommEvent のオーバーラップについて


> ここで期待通りにならないのは、アプリケーション終了時にth_event.SetEvent()を
> やっているにもかかわらず、
> ※1を実行しないため、※2も※3も実行せずに
> アプリケーションが終了してしまう点です。
> 通信している最中はちゃんと※1を実行します。
> WaitCommEvent()で処理が固まっている時はth_event.SetEvent()
> を検知できないのでしょうか。

サンプルプログラム TTY.C をご覧になれば
解決すると思いますが。
31

[mfc 33508] Re: VC++6.0 で int 型を使うには?

GIDAIです。

> 使われている入門書名を挙げて、他に良い入門書がないか尋ねてみられても
> 良いかと思います。
> 私が使っていたのは古すぎて参考になりそうにないので、
> 最近使われている方に尋ねてみられてはどうでしょうか?

私のお勧めは、「Visual C++」シリーズ3部作(翔泳社:山本 信雄 著)で、
第1部がSDKでのプログラミング、第2部がクラスについて、第3部がMFCについて書
かれています。
同じようにVBについても3部作で出版されています。
この本は、「最終目標はMSDNで調べながらプログラミングできるように」ということ
に観点をおいて
書かれていること、Windowsプログラミングの基礎を第1部一冊かけて学習すること
ができること
がよいところと思います。
私の感想では、一番解りやすく、細かく書かれていると思います。
例題は他の書籍に比べると実用的ではないかもしれませんが、お勧めです。
私はこの本で基礎的なところを学びました。(というか一通り読んだ)
実用的なところは他の本、またはインターネットで学んでいます。
私は、VCを使い始めてまだ1年未満、C++自体もほとんど変わりません。
他の皆さんに比べるとひよっこですから、ruuさんに一番近いところにいると思いま
す。
何がなんだかわからないでしょうが、場数を踏んでいくことでVCの作法が見えてくる

思いますので、がんばってください。
31

[mfc 33508] Re: VC++6.0 で int 型を使うには?

GIDAIです。

> 使われている入門書名を挙げて、他に良い入門書がないか尋ねてみられても
> 良いかと思います。
> 私が使っていたのは古すぎて参考になりそうにないので、
> 最近使われている方に尋ねてみられてはどうでしょうか?

私のお勧めは、「Visual C++」シリーズ3部作(翔泳社:山本 信雄 著)で、
第1部がSDKでのプログラミング、第2部がクラスについて、第3部がMFCについて書
かれています。
同じようにVBについても3部作で出版されています。
この本は、「最終目標はMSDNで調べながらプログラミングできるように」ということ
に観点をおいて
書かれていること、Windowsプログラミングの基礎を第1部一冊かけて学習すること
ができること
がよいところと思います。
私の感想では、一番解りやすく、細かく書かれていると思います。
例題は他の書籍に比べると実用的ではないかもしれませんが、お勧めです。
私はこの本で基礎的なところを学びました。(というか一通り読んだ)
実用的なところは他の本、またはインターネットで学んでいます。
私は、VCを使い始めてまだ1年未満、C++自体もほとんど変わりません。
他の皆さんに比べるとひよっこですから、ruuさんに一番近いところにいると思いま
す。
何がなんだかわからないでしょうが、場数を踏んでいくことでVCの作法が見えてくる

思いますので、がんばってください。
31

[mfc 33507] Re: WaitCommEvent のオーバーラップについて

Sanさん、お世話になります。
たしかに前回のコードは少し変だった気がします。
Sanさんのご指摘どおり、CreateEventは最初の1回、
SetCommMaskは終わりに実行という形で
ちょっと手を入れてみたのですが、結果は変わりません。
すこし問題を整理すると・・・

アプリケーション終了時にCMainFrameのOnClose()で
 th_event.SetEvent();
を実行し、各スレッドに終了を通知します。
(th_eventはCEvent型のグローバル変数)

各スレッドでは無限ループで処理を繰り返しながら
th_eventを監視します。このときSetCommMask()を
実行するようにしました。

UINT ComFunc( LPVOID pParam )
{
 int iPortNo = (int)( pParam );
 m_ov.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );

 while(1){
   if( th_event.Lock(0) ){
    SetCommMask( GetComHandle(), 0 ); ※1
    break;
   }
   else{
    if( !.PolingCom(  ) )
      break;
   }
 }
 return 0;
}

PolingCom(  ) 内で前回のRxData()が呼ばれています。
(もう少し詳しいコードを書きます)

RxData(){
  GetCommMask( m_hCom, &lpEventMask );
  lMask = lpEventMask | EV_RXCHAR;
  SetCommMask( m_hCom, lMask );

  WaitCommEvent( m_hCom, &lpEventMask, &m_ov );
  if( ( lpEventMask ) && ( EV_RXCHAR ) ){

   if( !GetOverlappedResult( m_hCom, &m_ov, &dwLength, TRUE ) ){
    return 0; ※2
   }

 (略)
   ret = ReadFile( m_hCom, stHeader, HEADER_SIZE, &ReadBytes, &m_ov );
    if( ret == FALSE )
     if ( GetLastError() == ERROR_IO_PENDING ) ※3
      return 0;

 }

(略)



ここで期待通りにならないのは、アプリケーション終了時にth_event.SetEvent()を
やっているにもかかわらず、
※1を実行しないため、※2も※3も実行せずに
アプリケーションが終了してしまう点です。
通信している最中はちゃんと※1を実行します。
WaitCommEvent()で処理が固まっている時はth_event.SetEvent()
を検知できないのでしょうか。

分かりにくい説明で恐縮ですが、
どうかご教授お願い致します。

小沢 和也
記事検索
Amazon.co.jp
  • ライブドアブログ