Какой самый быстрый способ обновить элемент управления, нарисованный владельцем?

У меня есть элемент управления, нарисованный владельцем, который отображает данные. Данные меняются со временем. Мне нужно найти быстрый способ непрерывного обновления элемента управления.

Я пытался использовать таймеры, но проблема в том, что только таймер работает со скоростью не более 65 кадров в секунду. И если метод рисования управления требует времени, fps становится довольно низким.

Я попытался запросить обновление (InvalidateRect) из метода рисования элемента управления, таким образом он перерисовывает элемент управления сотни раз в секунду, однако остальная часть пользовательского интерфейса не работает должным образом (например, кнопки не обновляются, всплывающие подсказки заморожены и т. д.).

Как правильно обновить элемент управления, нарисованный владельцем, как можно быстрее, сохраняя при этом отзывчивость пользовательского интерфейса?

P. S. Мне это нужно для работы с GDI, поэтому я не могу использовать OpenGL/Direct3D для отображения своих данных.


person Lev    schedule 25.06.2015    source источник
comment
Рассмотрите возможность переноса обработки в отдельный поток. Нарисуйте растровое изображение там, а затем отправьте потоку пользовательского интерфейса сообщение, чтобы переместить бит в ваше окно.   -  person David Heffernan    schedule 25.06.2015


Ответы (1)


Если вы хотите обновить его буквально как можно быстрее, запустите цикл обработки сообщений, который не ожидает ввода. Если вы продолжите обрабатывать сообщения, пользовательский интерфейс останется отзывчивым, но когда сообщений не будет, ваш элемент управления будет продолжать обновляться.

Псевдокод:

while (!fQuit)
{
    while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
        DispatchMessage(&msg);
    RepaintControl();
}

В зависимости от того, как реализован ваш элемент управления, функция «перерисовать» может быть такой простой, как:

RedrawWindow(hwndControl, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW);

Если вы обнаружите, что это слишком сильно тормозит вашу машину (хотя с многоядерным все должно быть в порядке) или обновляется слишком быстро, вы можете использовать таймер ожидания, чтобы получить обновление с более высоким разрешением, но при этом получать временами контролировать. См. Использование объектов таймера ожидания для получения подробной информации о таймерах ожидания.

person Jonathan Potter    schedule 25.06.2015