Я хочу продолжать рендеринг в основном потоке, в то время как Windows обрабатывает сообщения, даже во время модальных петель, таких как при перемещении или изменении размера окна. Чтобы достичь этого, я использую волокна, чтобы пропустить модальную цикл. Только нажмите кнопку мыши на строке заголовка, есть короткая заморозка.#include
#include
bool running = true;
int frameCount = 0;
int timer = 0;
LPVOID mainFiber;
LPVOID messageFiber;
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
running = false;
return 0;
case WM_ENTERSIZEMOVE:
printf("Enter modal loop\n");
SetTimer(hwnd, timer, 1, nullptr); // set timer promise can render even in modal loop
break;
case WM_EXITSIZEMOVE:
printf("Exit modal loop\n");
KillTimer(hwnd, timer);
break;
case WM_TIMER:
if (wParam == timer) SwitchToFiber(mainFiber); // switch to main fiber for rendering in modal loop
break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
void MessageProc(LPVOID)
{
MSG msg{};
while (true) // keep messageFiber always valid for multiple calling SwitchToFiber(messageFiber)
{
while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
SwitchToFiber(mainFiber);
}
}
int main()
{
const wchar_t CLASS_NAME[] = L"Test Window";
WNDCLASSW wc{};
wc.lpfnWndProc = WindowProc;
wc.hInstance = GetModuleHandle(nullptr);
wc.lpszClassName = CLASS_NAME;
RegisterClassW(&wc);
HWND hwnd = CreateWindowW(CLASS_NAME, L"Title", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, GetModuleHandle(nullptr), NULL);
if (!hwnd) return 1;
ShowWindow(hwnd, SW_SHOW);
// create fibers
mainFiber = ConvertThreadToFiber(nullptr);
messageFiber = CreateFiber(0, &MessageProc, nullptr);
while (running)
{
SwitchToFiber(messageFiber);
// assume rendering here
printf("frameCount: %d\n", ++frameCount);
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... ith-fibers
Короткое замораживание на Mouse Press в заглавном панели при пропуске Modal Loop с волокнами ⇐ C++
Программы на C++. Форум разработчиков
1757269193
Anonymous
Я хочу продолжать рендеринг в основном потоке, в то время как Windows обрабатывает сообщения, даже во время модальных петель, таких как при перемещении или изменении размера окна. Чтобы достичь этого, я использую волокна, чтобы пропустить модальную цикл. Только нажмите кнопку мыши на строке заголовка, есть короткая заморозка.#include
#include
bool running = true;
int frameCount = 0;
int timer = 0;
LPVOID mainFiber;
LPVOID messageFiber;
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
running = false;
return 0;
case WM_ENTERSIZEMOVE:
printf("Enter modal loop\n");
SetTimer(hwnd, timer, 1, nullptr); // set timer promise can render even in modal loop
break;
case WM_EXITSIZEMOVE:
printf("Exit modal loop\n");
KillTimer(hwnd, timer);
break;
case WM_TIMER:
if (wParam == timer) SwitchToFiber(mainFiber); // switch to main fiber for rendering in modal loop
break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
void MessageProc(LPVOID)
{
MSG msg{};
while (true) // keep messageFiber always valid for multiple calling SwitchToFiber(messageFiber)
{
while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
SwitchToFiber(mainFiber);
}
}
int main()
{
const wchar_t CLASS_NAME[] = L"Test Window";
WNDCLASSW wc{};
wc.lpfnWndProc = WindowProc;
wc.hInstance = GetModuleHandle(nullptr);
wc.lpszClassName = CLASS_NAME;
RegisterClassW(&wc);
HWND hwnd = CreateWindowW(CLASS_NAME, L"Title", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, GetModuleHandle(nullptr), NULL);
if (!hwnd) return 1;
ShowWindow(hwnd, SW_SHOW);
// create fibers
mainFiber = ConvertThreadToFiber(nullptr);
messageFiber = CreateFiber(0, &MessageProc, nullptr);
while (running)
{
SwitchToFiber(messageFiber);
// assume rendering here
printf("frameCount: %d\n", ++frameCount);
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79757736/short-freeze-on-mouse-press-in-title-bar-when-skipping-modal-loop-with-fibers[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия