Тема: Оптимізація програми
Я зацікавився циклом обробки повідомлень.
Зазвичай, середовище розробки генерує такий код:
MSG msg;
/*
This is the heart of our program where all input is processed and
sent to WndProc. Note that GetMessage blocks code flow until it receives something, so
this loop will not produce unreasonably high CPU usage
*/
while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */
TranslateMessage(&msg); /* Translate key codes to chars if present */
DispatchMessage(&msg); /* Send it to WndProc */
}
return msg.wParam;
Я подумав, що саме з нього потрібно починати оптимізацію програми.
На сайті Майкрософт я продивився функції GetMessage() і PeekMessage().
https://docs.microsoft.com/uk-ua/window … getmessage
https://docs.microsoft.com/ru-ru/window … age-queues
Код з Майкрософт дуже відрізняється від згенерованого:
BOOL bRet;
HWND hWnd;
while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
А ось PeekMessage():
HWND hwnd;
BOOL fDone;
MSG msg;
// Begin the operation and continue until it is complete
// or until the user clicks the mouse or presses a key.
fDone = FALSE;
while (!fDone)
{
fDone = DoLengthyOperation(); // application-defined function
// Remove any messages that may be in the queue. If the
// queue contains any mouse or keyboard
// messages, end the operation.
while (PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE))
{
switch(msg.message)
{
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_KEYDOWN:
//
// Perform any required cleanup.
//
fDone = TRUE;
}
}
}
Мене також зацікавило, як тип BOOL (windows bool) може мати значення "-1".
Слідуюче, що я знайшов - це прискорювач.
HWND hwndMain;
HWND hwndDlgModeless = NULL;
MSG msg;
BOOL bRet;
HACCEL haccel;
//
// Perform initialization and create a main window.
//
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
if (hwndDlgModeless == (HWND) NULL ||
!IsDialogMessage(hwndDlgModeless, &msg) &&
!TranslateAccelerator(hwndMain, haccel,
&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
А потім я цілий день шукав, як його завантажити:
https://docs.microsoft.com/ru-ru/window … celerators
І в мене залишилося багато запитань, які я хочу задати тут:
1. Для чого потрібні проскорювачі?
2. Чи можна оброблювати повідомлення не в LPRESULT CALLBACK WndProc, а прямо в головній функції?
3. Головне. Як так змінити процес обробки, щоб програма працювала швидше?
Потрібно прискорити роботу програми, щоб вона не завантажувала процесор в режимі роботи та простоювання.