Высокая нагрузка на ЦП при выполнении программы

150
10 июля 2019, 06:30

При вводе количества секунд начинает грузить процессор.

#include <iostream>
#include <Windows.h>
using namespace std;
int main()
{
    int time,x,y;
    bool state = false;
    cout << "Time between clicks(in ms): ";
    cin >> time;
    cout << "Press F12 to activate / deactivate the script.";
    POINT mouse;
    while(true)
    {       
        if (GetAsyncKeyState(VK_F12))
        {
            if (state == false) 
            {
                state = true;
                Sleep(250);
            } else
            {
                state = false;
                Sleep(250); 
            }
        }
        if (GetKeyState(VK_LBUTTON) & 0x8000 && (state == true))
        {
            GetCursorPos(&mouse); 
            mouse_event(MOUSEEVENTF_LEFTUP,mouse.x,mouse.y ,0,0); 
            mouse_event(MOUSEEVENTF_LEFTDOWN,mouse.x,mouse.y ,0,0); 
            Sleep(time);
        }
        if (GetKeyState(VK_RBUTTON) & 0x8000 && (state == true))
        {
            GetCursorPos(&mouse); 
            mouse_event(MOUSEEVENTF_RIGHTUP,mouse.x,mouse.y ,0,0); 
            mouse_event(MOUSEEVENTF_RIGHTDOWN,mouse.x,mouse.y ,0,0); 
            Sleep(time); 
        }
    }
}

Что можно сделать в данной ситуации?

Answer 1

Не нужно вызывать GetAsyncKeyState в цикле только с целью глобального отлова нажатий клавиатуры или мыши. При таком способе у вас всегда программа либо слишком сильно нагружает процессор, либо недостаточно быстро реагирует на события. Вместо этого, используйте специально для этого предназначенный механизм, Low-level keyboard (mouse) hook:

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
bool state = false;
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{    
    if (nCode == HC_ACTION)
    {
        switch (wParam)
        {
        case WM_KEYDOWN:
            PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
            if(p->vkCode == VK_F12) {               
                state = !state;             
            }           
            break;
        }
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}
LRESULT CALLBACK LowLevelMouseProc( int    nCode, WPARAM wParam,LPARAM lParam){
    if (nCode == HC_ACTION)
    {
        switch (wParam)
        {
        case WM_LBUTTONDOWN:            
            if(state != false) {
                //выполнить необходимые действия при нажатии кнопки мыши...             
            }
            break;
        }
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int main(int argc, char* argv[])
{
    printf("Press F12 to activate / deactivate the script.");
    HHOOK hook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0);
    if(hook == NULL) {
        printf("Failed to install keyboard hook!\n");
        getchar();
        return 1;
    }
    hook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, 0, 0);
    if(hook == NULL) {
        printf("Failed to install mouse hook!\n");
        getchar();
        return 1;
    }
    MSG msg;
    while (!GetMessage(&msg, NULL, NULL, NULL)) {    
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }       
    return 0;
}
READ ALSO
массив структур в классе c++

массив структур в классе c++

Подскажите, пожалуйста, как реализовать поставленную задачу"Завод выпускает разные измерительные приборы

141
Как укоротить сообщения об ошибках и предупреждения компилятора?

Как укоротить сообщения об ошибках и предупреждения компилятора?

Как укоротить сообщения об ошибках и предупреждения компилятора? Особенно при ошибках в шаблонах сначала идёт куча строк, в каком файле инстанциация...

154
could not initialize proxy - no Session (through reference chain: com.statistic.server.entity.Report$HibernateProxy$kjlzJLtW[&ldquo;date&rdquo;]

could not initialize proxy - no Session (through reference chain: com.statistic.server.entity.Report$HibernateProxy$kjlzJLtW[“date”]

После деплоя сервера при попытке получить JSON по адресу

143
Как применить размер шрифта к label?

Как применить размер шрифта к label?

Пишу программу на JavaFX и Scene Builder

126