WaitCommEventのイベント取得時の疑問

[戻る]
Vez 2008/12/19(金) 16:08:13
初めまして,Vezと申します.
シリアルポートのデータを受信するアプリを作成しています.
受信用のスレッドを作成し,WaitCommEventを使用してデータを待つように作成したので
すが,動作に疑問を感じています.

疑問点1:
WaitCommEvent(m_hCOM, &dwEvt, NULL) で受信待ちを行っているときに,
アプリが終了処理を行い,CloseHandle で通信ハンドルを閉じてしまいます.
このとき,イベントは発生するのでしょうか?
また,WaitCommEvent関数は成功するのでしょうか?

疑問点2:
WaitCommEvent(m_hCOM, &dwEvt, NULL) で受信待ちを行っています.
このとき,m_hCOMがFILE_FLAG_OVERLAPPEDフラグをセットして開かれていた場合,
何か問題が発生するでしょうか?
NULLを指定している部分は,OVERLAPPED 構造体へのポインタを指定すべきでしょうか.


以上,御回答よろしくお願い致します.

開発環境:WinXP(SP2) VC++6.0 SDK


以下のような関数を作成し,受信イベントを待っています.

BOOL comWaitEvent(void)
{
    DWORD dwEvt = 0;
    BOOL bResult;
    HANDLE hTemp;

    CS.Lock(); // CriticalSection lock
    hTemp = m_hCOM;
    CS.Unlock();// CriticalSection unlock

    SetCommMask(hTemp, EV_RXCHAR); //EV_RXCHAR
    if(WaitCommEvent(hTemp, &dwEvt, NULL))
    {
        if((dwEvt & EV_RXCHAR) == EV_RXCHAR)
            bResult = TRUE;
        else
            bResult = FALSE;
    }
    else
        bResult = FALSE;

    return bResult;
}

しま 2008/12/21(日) 17:12:07
>疑問点1:
>WaitCommEvent(m_hCOM, &dwEvt, NULL) で受信待ちを行っているときに,
>アプリが終了処理を行い,CloseHandle で通信ハンドルを閉じてしまいます.
>このとき,イベントは発生するのでしょうか?
>また,WaitCommEvent関数は成功するのでしょうか?

アプリケーションの終了処理が動いているのなら WaitCommEvent() が成功しようが
失敗しようが関係ないと思うのは私の理解が足りないだけでしょうか?
なぜそのようなことが気懸かりになるのか他人に分かるように書いてみて下さい

>疑問点2:
>WaitCommEvent(m_hCOM, &dwEvt, NULL) で受信待ちを行っています.
>このとき,m_hCOMがFILE_FLAG_OVERLAPPEDフラグをセットして開かれていた場合,
>何か問題が発生するでしょうか?
>NULLを指定している部分は,OVERLAPPED 構造体へのポインタを指定すべきでしょう
か.

msdn で WaitCommEvent は検索して読んだ上での質問でしょうか?
ファイルハンドルが FILE_FLAG_OVERLAPPED フラグありでで開いたものだった場合
WaitCommEvent() の第三引数に OVERLAPPED 構造体のポインターが必要と書いています
よ

Vez 2008/12/21(日) 23:18:51
しまさん、御回答、ありがとうございます。

>アプリケーションの終了処理が動いているのなら WaitCommEvent() が成功しようが
>失敗しようが関係ないと思うのは私の理解が足りないだけでしょうか?
>なぜそのようなことが気懸かりになるのか他人に分かるように書いてみて下さい

ごもっともです。説明が足りませんでした。
通信切断時にイベントを発生させたいのは、受信用スレッド内でループさせている処理を
終了させて、スレッドを閉じてから、終了処理を行いたいためです。
成功するかどうかにつきましては、ご指摘のとおり、どちらであっても問題ないように作
成しています。このような場合、イベントフラグが立つのか、関数が不正終了してしまう
のではないのか、という、調査の際に解決できなかった問題で、単純に興味です。


>ファイルハンドルが FILE_FLAG_OVERLAPPED フラグありでで開いたものだった場合
>WaitCommEvent() の第三引数に OVERLAPPED 構造体のポインターが必要と書いています

作成後、動作していることを確認した後で、疑問点2の問題に気づきました。修正を考え
ていますが、どのような問題が発生するのかを理解した上で、修正版を作りたいと考えて
います。
ご存知の方がいらっしゃいましたら、御回答お願い致します。

しま 2008/12/22(月) 00:52:45
>修正を考えていますが、どのような問題が発生するのかを理解した上で、
>修正版を作りたいと考えています。
>ご存知の方がいらっしゃいましたら、御回答お願い致します。

以前に回答したように MSDN の WaitCommEvent() の解説に書いてあります
MSDN は調べて読みましたか????

Vez 2008/12/22(月) 09:23:09
[[解決]]
>MSDN は調べて読みましたか????

もちろん調べました。「関数が操作の完了を誤って報告することがあります。」
という内容が、曖昧に感じられたため、使用方法によっては問題ないのか、と
感じられてしまっていました。 
素直に、可能性がある、という意味なのだと受け取ればよかったのですね。

くだらない質問で、不快な思いをさせてしまい、申し訳ありませんでした。
深くお詫び致します。

しま 2008/12/22(月) 10:25:18
>>MSDN は調べて読みましたか????

>くだらない質問で、不快な思いをさせてしまい、申し訳ありませんでした。
>深くお詫び致します。

不快な思いなどしていませんよ。なのでお詫びも私には不要です
ただ、msdn で調べたかどうか文面から読み取れなかったのでそう書いたということです

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