4

別の投稿で、「新しいスレッドは、明示的に作成した場合にのみ作成されます。C++ プログラムはデフォルトでシングル スレッドです。」ollydbg で新しいスレッドを明示的に作成しないプログラムを開くと、2 つのスレッドが実行されていることが多いことに何度も気付きました。実行を停止せずにメッセージループがどのように機能するかを理解したかったのですが、私が得た説明は、それがどのように機能するかを説明するのに非常に不十分でした.

メッセージ ループは新しいスレッドを作成しますか、それともメイン スレッドを占有しますか? コードの順序に関係なく、他のすべてが実行された後にメインスレッドを実行しますか? これを行わずにメイン スレッドを占有する場合、新しいスレッドを生成して、メッセージ ループでスタックする代わりにプログラムを実行できるようにしますか?

編集:実験で私の質問のほとんどを解決しました。メッセージ ループは、メイン スレッドとコードの後のすべてのコードを占有します。

while (GetMessage (&messages, NULL, 0, 0))
{
    TranslateMessage(&messages);
    DispatchMessage(&messages);
}
return messages.wParam;

プログラムがメッセージ ループでスタックしているため、プログラムを実行させるために何か特別なことを行わない限り実行されません。実行されるウィンドウ プロシージャに無限ループを配置すると、プログラムがクラッシュします。私が好む程度にオリーにいるとき、私はまだ複数のスレッドの謎を理解していません。

4

2 に答える 2

10

まず最初に、「メッセージ ループ」はそれ自体ではないことを理解することから始めましょ。それは実際にはスレッドが行うことです。

ウィンドウ内のスレッドは、通常、UI を所有するスレッドと、バックグラウンド作業 (ネットワーク操作など) を行うスレッドの 2 つのカテゴリのいずれかに分類されます。

通常、単純な UI アプリには、UI スレッドであるスレッドが 1 つだけあります。UI を機能させるには、処理する入力 (マウス クリック、キーボード入力など) があるまでスレッドを待機し、入力を処理 (状態の更新やウィンドウの再描画など) してから、さらに待機する必要があります。入力。この「入力を待ち、処理し、繰り返す」という行為全体メッセージループです。(この段階で言及する価値があるのは、メッセージ キューです。各スレッドには、スレッドの入力メッセージを格納する独自の入力キューがあります。スレッドが「入力を待機している」という行為は、実際には、キューに何かがあるかどうかを確認することです。 、そうでない場合は、存在するまで待機します。) win32 で言えば、スレッドがこの方法でアクティブに入力を処理している場合、それは「メッセージのポンピング」とも呼ばれます。

典型的な単純な Windows アプリのメインライン コードは、最初に基本的な初期化を行い、メイン ウィンドウを作成してから、入力を待って処理するメッセージ ループを実行します。これは通常、ユーザーがメイン ウィンドウを閉じるまで行われ、その時点でスレッドはループを終了し、その後に続くコード (通常はクリーンアップ コード) の実行を続けます。

Windows アプリの一般的なアーキテクチャは、メインの UI スレッド (通常はこれがメイン スレッド) を持ち、すべての UI を作成して所有し、スレッドが作成したすべての UI のメッセージをディスパッチするメッセージ ループを持ちます。ソケットからの読み取りなど、アプリが潜在的にブロックする可能性のある何かを行う必要がある場合、ワーカー スレッドがその目的でよく使用されます。UI スレッドがブロックされるのは望ましくありません (たとえば、ソケットからの入力を待機している間)。 、その間は入力が処理されず、UI が応答しなくなるためです。

複数の UI スレッドを持つアプリを作成することもできますが、ウィンドウを作成する各スレッドには独自のメッセージ ループが必要になります。

表示されている他のスレッドは、バックグラウンド タスクを実行するために Windows によって作成された、ある種のヘルパー スレッドである可能性があります。ほとんどの場合、それらは無視できます。たとえば、COM を初期化すると、Windows は COM 内部のものを管理するためのワーカー スレッドを作成することになり、非表示の HWND も作成する可能性があります。

于 2013-01-24T04:17:20.087 に答える
2

通常、プログラムを開始するスレッドはメッセージ ループのみを実行し、メイン スレッドを占有します。メッセージの処理や UI の更新の一部ではないことは、通常、他のスレッドによって行われます。アプリケーションがスレッドを作成しない場合でも表示される追加のスレッドは、ライブラリまたはオペレーティング システムによって作成される可能性があります。Windows はプロセス内にスレッドを作成して、メッセージ ループへのイベントのディスパッチなどを処理します。

于 2013-01-24T02:54:33.187 に答える