1

ウィンドウなし、ウィンドウ クラスなし、while ループの CPU 消費なし、CPU 消費量が少ないメッセージ ループを使用するコンソールなしのプログラムを作成する方法は?

以下に私の要件を説明しています。

タイマーを使用し、ウィンドウを必要としない win32 API プログラムを作成しています。

  1. マニュアルによると、デフォルトのメッセージループは、ウィンドウが関連付けられている場合にのみ実行されます。

  2. CPUに過度の負荷をかけるwhileループとスリープ機能を防ぐように明確に述べている他のstackoverflowコンテンツを調べました。

  3. このプログラムをウィンドウなしでバックグラウンド プログラムのように実行したい。

  4. setTimer 関数の最後のパラメーターとしてコールバック関数を使用しているため、ウィンドウ プロシージャを使用する必要はありません。

  5. プログラムを実行し続けながらCPUを過負荷にしないデフォルトのメッセージループで使用するイベント/オブジェクトについて聞いたことがあります。これが唯一の方法ですか?まだ、このオプションの使い方がわかりません。

CPU やその他のリソースにコストをかけずにこの種のアプリを作成する方法として、どのような方法があるでしょうか?

あなたの提案と参考文献は本当に役に立ちます。

これは、他のディスカッションで述べたようにウィンドウが関連付けられていないため、終了するコードです。

#include <windows.h>

void getidle();

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{

    SetTimer(NULL, 1, 5000, (TIMERPROC) getidle);
    MSG msg;


    while (GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

void getidle()
{
  //some code here
}

そのため、別の種類のメッセージ ループを使用する必要があり、その使用方法がわかりません。MsgWaitForMultipleObjects または WaitForSingleObject のようなもの。? .

その上、msgwait... waitforsigle... またはイベントオブジェクトのような上記の方法を実行することにより、これらがウィンドウを非表示にするだけでより多くのリソースを消費する可能性がある場合にのみ、その単純な方法で行くことも指定してください...

それは働いています

実行されないと言っている人を読んだので、それがどのように機能するのか本当に疑問に思っています。私はネットで詳細情報を検索していましたが、それは機能していました...わかりません。

大丈夫ですか?それは適切な方法ですか?混乱している。

4

1 に答える 1

3

GetMessageはブロッキング呼び出しです。つまり、使用可能なメッセージがない場合、メッセージは返されません。メッセージを受信するために周りにない非表示のウィンドウがある場合、メッセージループを含むスレッドはCPUリソースを消費しません。処理するメッセージの1つはWM_QUITです。これにより、クリーンな終了が可能になります。このメッセージPostMessageは、コードの他の場所に自分で投稿できます。

この方法でアプローチする場合は、メッセージループの前に他のスレッドとタイマーを設定する必要があります。これは、GetMessageブロックすると他に何もできないためです。

于 2012-11-05T14:04:50.350 に答える