katastrophale Performance



  • Hallo 🙂

    Ich habe folgendes Programm:

    #include <windows.h>
    #pragma comment(lib, "User32.lib")
    
    HWND HWC3 = FindWindow(NULL,TEXT("Warcraft III"));
    
    void keydown()
    {
    	HWND SetActiveWindow(HWC3);
    	SendMessage(HWC3,WM_KEYDOWN,VK_OEM_4,0);
    	SendMessage(HWC3,WM_KEYDOWN,VK_OEM_6,0);
    }
    
    void keyup()
    {
    	HWND SetActiveWindow(HWC3);
    	SendMessage(HWC3,WM_KEYUP,VK_OEM_4,0);
    	SendMessage(HWC3,WM_KEYUP,VK_OEM_6,0);
    }
    
    void schliessen()
    {
    	HWND SetActiveWindow(HWC3);
    	SendMessage(HWC3,WM_KEYUP,VK_OEM_4,0);
    	SendMessage(HWC3,WM_KEYUP,VK_OEM_6,0);
    }
    
    int main()
    {
    	if (!HWC3)
    	{
    		MessageBox(0, TEXT("Du musst erst Warcraft III starten"), 0, 0);		
    	}
    	else
    	{
    		while (true)
    		{
    			if(GetAsyncKeyState(VK_HOME))
    			{
    				keydown();
    			}
    			if(GetAsyncKeyState(VK_END))
    			{
    				keyup();
    			}
    			if(GetAsyncKeyState(VK_ESCAPE))
    			{
    				schliessen();			
    			}
    		}
    	}
    }
    

    Wenn ich Warcraft gestartet hab, und das Programm starte, funktioniert dieses Programm zwar, aber es verbraucht annähernd 100% der Prozessorleistung.

    Liegt das an der while (true) Schleife ? Und wenn ja, was kann ich dagegen tun ?

    Vielen Dank !



  • Den Thread für kurze Zeit schlafen legen....

    Ein yield ändert zwar nix an der Prozessorauslastung, allerdings
    haben andere Prozesse "Vorrang".



  • ok, also bei ich sleep() ein. Die Idee is schon mal super

    Und was meintest du mit dem yield ?? 🙂



  • bastel ein Sleep(1) in die while-schleife rein.



  • BetterPerformance schrieb:

    Ein yield ändert zwar nix an der Prozessorauslastung, allerdings
    haben andere Prozesse "Vorrang".

    Ein "Yield()" ändert in 32-Bit-Code genau nichts:

    winbase.h schrieb:

    /*
     * Compatibility macros
     */
    ...
    #define Yield()
    


  • ok brauch ich ja auch net. Sleep() funktioniert wunderbar !



  • hmm ... vllt eher mal deinen Code auch umstellen?

    #include <windows.h>
    #pragma comment(lib, "User32.lib")
    
    void key_down(HWND hWnd)
    {
    	if (hWnd == NULL || IsWindow(hWnd) == FALSE)
    		return;
    
    	SetActiveWindow(hWnd);
    	SendMessage(hWnd, WM_KEYDOWN, VK_OEM_4, 0);
    	SendMessage(hWnd, WM_KEYDOWN, VK_OEM_6, 0);
    }
    
    void key_up(HWND hWnd)
    {
    	if (hWnd == NULL || IsWindow(hWnd) == FALSE)
    		return;
    
        SetActiveWindow(hWnd);
        SendMessage(hWnd, WM_KEYUP, VK_OEM_4, 0);
        SendMessage(hWnd, WM_KEYUP, VK_OEM_6, 0);
    }
    
    void close(HWND hWnd)
    {
        if (hWnd == NULL || IsWindow(hWnd) == FALSE)
    		return;
    
    	key_up();
    }
    
    int main()
    {
    	HWND hWndWarcraft3 = FindWindow(NULL, TEXT("Warcraft III"));
        if (hWndWarcraft3 == NULL || IsWindow(hWndWarcraft3) == FALSE)
    	{
    		MessageBox(NULL, TEXT("Bitte starten Sie \"Warcraft III\"!"), TEXT("Fehler"), MB_OK | MB_ICONERROR);
    		return;
        }
    
    	bool stop = false;    
    	while (!stop)
    	{
    		if (GetAsyncKeyState("a"))
    			stop = true;
    		if (GetAsyncKeyState(VK_HOME))
    			key_down(hWndWarcraft3);
    		if (GetAsyncKeyState(VK_END))
    			key_up(hWndWarcraft3);
    		if (GetAsyncKeyState(VK_ESCAPE))
    			close(hWndWarcraft3);    
    
    		Sleep(100);
    	}
    }
    

    🙂



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • (...)
    // if (GetAsyncKeyState("a"))  // "a" -> 0x61 -> VK_NUMPAD1
     if (GetAsyncKeyState(0x41)) // 0x41 -> VK_A
    (...)
    

    🙂



  • merker schrieb:

    (...)
    // if (GetAsyncKeyState("a"))  // "a" -> 0x61 -> VK_NUMPAD1
     if (GetAsyncKeyState(0x41)) // 0x41 -> VK_A
    (...)
    

    🙂

    (...)
    // if (GetAsyncKeyState("a"))  // "a" -> 0x61 -> VK_NUMPAD1
    // if (GetAsyncKeyState(0x41)) // 0x41 -> VK_A
     if (GetAsyncKeyState('A'))
    (...)
    

Anmelden zum Antworten