0

興味がある場合は背景を説明します。それ以外の場合は、下部の質問に直接行くことができます。

2 つのイベント オブジェクトの状態がシグナル状態になるかどうかをチェックする 2 つの条件で無限whileループが発生するという問題が発生しています。if

while(1)
{
    if(DAQ_Comm_Server::usb_detect_flag == false)
    {
        if(WaitForSingleObject(USB_PHY_CONN,INFINITE) == WAIT_OBJECT_0)
        {
            DAQ_Comm_Server::usb_detect_flag = true;
        }
    }

    if(DAQ_Comm_Server::usb_detect_flag == true)
    {
        if(WaitForSingleObject(USB_PHY_DISCONN, INFINITE) == NULL)
        {
            DAQ_Comm_Server::usb_detect_flag = false;
        }   
    }
}

イベント オブジェクトはUSB_PHY_CONN、ハードウェア USB 接続を検出し、対応するイベント オブジェクトの設定USB_PHY_DISCONNに使用する OS/BSP USB ドライバー コードで設定されています。SetEvent()

のドキュメントを読むとWaitForSingleObject()、スレッド内で使用する必要があると明示的に述べられていませんが、何度も読んだ後、それが暗示されているように感じますが、100%確実ではありません.

私が抱えている問題は、コードが while ループを初めて実行したとき (つまり、usb が最初に切断され、次に接続され、切断された)、システムが正常に動作し、ハングしないことです。ただし、USB を再接続すると、システムがフリーズします。デバイスが応答しなくなり、UI がフリーズし、コードが失われます。

さて、上記のコードが含まれているプロセスを強制終了すると、すべてが元に戻り、正常に動作し続けます。いくつか読んだところWaitForSingleObject()、デッドロックの可能性があるようですが、それは常にスレッドに関するものであることに気付きました。

私の質問はWaitForSingleObject()スレッドで使用する必要がありますか? メインの無限ループで使用すると、デッドロックやシステムのフリーズが発生するリスクが高くなりますか?

注: これは、VS2008 を使用したプラットフォーム ビルダー Windows 組み込み CE 7 プロジェクトです。

4

1 に答える 1