0

ダイアログ ボックスのフリーズを解除する方法を教えてください。私は MFC を使用しており、ボタンが押されたときに実行したい無限ループがあります。ただし、無限ループが開始されると、ダイアログ ボックスがフリーズします。今 、誰かが同様の問題を抱えているこのスレッドを見ました。

残念ながら、マルチスレッドを試してみましたが、OLE オートメーションを使用する API を使用していて、未処理のメモリ例外が発生しているため、うまくいかないことがわかりました。これは、プログラムがシリアルポートを使用していて、シリアルポートへのハンドルを1つのスレッドでしか使用できない場所を読んだためだと思います。

私のプログラムは、誰かが私のモデムにダイヤルインしたかどうかを確認し、ファイルが送られてくるのを待ってから電話を切るだけです。これが私のループです。

while(1)
    {
        //get rid of input buffer
        ts->_this->m_pHAScript->haReleaseRemoteInput();
        ts-> _this->textBox->SetWindowTextA("thread Commence");
        //wait for connected
        if(success = ts->_this->m_pHAScript->haWaitForString("CONNECT",timeout))
        {
            //getFile
            if(success = ts->_this->m_pHAScript->haWaitForXfer(5000))
            {
                //hangup
                ts->_this->haTypeText("+++ath\r");
            }
        }

    }

ダイアログ ボックスのフリーズを解除する方法はありますか?

4

2 に答える 2

1

次のコードを while ループ内に追加します。

MSG msg;
while(PeekMessage(&msg, GetSafeHwnd(), 0, 0, PM_REMOVE))
{
  DispatchMessage(&msg);
}
于 2012-05-16T18:09:15.970 に答える
1

Windows の GUI はメッセージ ループに依存しています。コードのどこかに、明示的またはフレームワークに隠されている場所に、キュー内のメッセージをチェックして処理するループがあります。コードがそのループに戻るのをブロックするものがあれば、GUI はフリーズします。

これにはいくつかの方法があります。1 つはDavid Brabantによって提供されたもので、基本的にループを複製しています。もう 1 つは、ブロッキング操作を独立して実行する新しい「ワーカー」スレッドを開始することです。メッセージ ループに、アイドル状態のときに呼び出す関数がある場合、つまり、キューにメッセージがもうない場合は、そこで何らかの処理を行うことができます。ただし、それはあなたの例では不可能です。

于 2012-05-16T18:47:17.033 に答える