2015-06-25 8 views
1

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

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

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

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

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

+0

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

ответ

2

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

псевдопользователей-код:

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

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

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

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