Короткое замораживание на Mouse Press в заглавном панели при пропуске Modal Loop с волокнамиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Короткое замораживание на Mouse Press в заглавном панели при пропуске Modal Loop с волокнами

Сообщение 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);
}
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... ith-fibers
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»