3

セットアップ:私はこのプログラムをC ++で持っています:

#include <windows.h>
using namespace std;
int main(){
    HWND window;
    AllocConsole();
    window = FindWindowA("ConsoleWindowClass", NULL);
    ShowWindow(window,0);
while (1){  
if (GetKeyState('A'))
        {
    system("start love.mp3");
    return 0;
        }
    }
return 0;
}

したがって、プログラムはプロセスとして実行され、キーAが押されるまで待機します。そしてそれはlove.mp3ファイルを再生します:)

ただし、プログラムが待機しているときは、CPU使用率の25%を消費します。

質問:プログラムがCPUをそれほど消費しないように、これを減らす方法はありますか?

4

4 に答える 4

8

あなたのプログラムはビジーウェイトの罪を犯しています。

を使用してキーボード呼び出しをフックしてみてくださいSetWindowsHookEx

于 2012-06-12T03:27:03.743 に答える
7

ループで呼び出すSleepことは一種の効果的ですが、IMO、それは明らかに間違った方法です。

代わりに、ブロッキング読み取りを実行してから、結果がAであったかどうかを確認し、次の場合に実行します。

while ((ch = getch()) != EOF)
    if (ch == 'A') {
        system("start love.mp3");
        break;
    }

これはキーストロークを見逃すことはなく、を呼び出すループよりもさらに少ないCPU時間を使用しますSleep

于 2012-06-12T03:27:37.717 に答える
4

Sleep()Windows関数の呼び出しをループに簡単に貼り付けることができます。引数はミリ秒単位であるため、これにより、キーボードが1秒間に約5回チェックされます。

#include <windows.h>
// ...
while (1){  
    if (GetKeyState('A'))
    {
        system("start love.mp3");
        return 0;
    }
    Sleep(200);
}
于 2012-06-12T03:22:59.870 に答える
2

これを行う正しい方法は、おそらくタイプWH_KEYBOARDまたはWH_KEYBOARD_LLフックのWindowsフックを使用して(ただし、WH_GETMESSAGEも機能します)、そこで処理を行うことです。

SetWindowsHookExのドキュメント(http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx )を参照してください。

I haven't tested this - just whipped it up on the fly - but here's a simple example that should do what you want when the 'A' key is pressed.

LRESULT __stdcall CALLBACK LoveProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    static int love = 0;

    if((nCode == HC_ACTION) && 
       (wParam == 'A') &&      /* the key pressed was 'A' */
       (lParam & 0x40000000))  /* trigger when the key is pressed */
    {        
        if(love == 0)
            play_romantic_love_song();

        /* but don't overdo it because "Too Much Love Will Kill You" */
        love = 1;
    }

    return CallNextHookEx(hOldKeyHook, nCode, wParam, lParam );
}

You may also want to google for "*SetWindowsHookEx WH_KEYBOARD*" as I'm pretty sure there's at least a couple of articles that explain this on CodeProject. I'd include the links, but I'm typing this from my iPhone and it's being... difficult.

于 2012-06-12T04:19:37.940 に答える