NoviceCoder871987 Ответов: 3

Задержка обновления графического интерфейса потока из рабочих потоков с помощью postmessage


Как я могу поставить некоторую задержку перед обновлением графического интерфейса потока из рабочих потоков с помощью Почтовое сообщение но не использовать сон?

Прием событий из сокетов полностью не синхронизирован.
Иногда в соединениях возникают всплески, и должна быть какая-то задержка, чтобы избежать затопления потока графического интерфейса.

Каков наилучший способ достичь этого с точки зрения производительности?

Что я уже пробовал:

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

3 Ответов

Рейтинг:
5

Rick York

Лично я серьезно сомневаюсь, что вы могли бы затопить поток графического интерфейса так сильно, что это было бы плохо.

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


NoviceCoder871987

Элемент управления Listview не реагирует во время загрузки элементов. Как я могу изменить listview, чтобы он реагировал во время загрузки элементов? я думал только об отсрочке. Другого решения для этого я не нашел.

Rick York

Он не может этого сделать, если вы не "выходите на воздух" между загрузочными входами в него. Я думаю, это вопрос, который вы считаете самым важным. Вы можете установить быстрый таймер (1 мс) и загружать одно сообщение за клик, и это будет держать ваше приложение отзывчивым, но это займет больше времени, или вы можете просто загрузить их все как можно быстрее. Если вы загружаете их все сразу, вы можете отключить обновления listview, и это ускорит процесс еще больше.

NoviceCoder871987

Спасибо за ваш ответ. Загрузка элементов выполняется не за один раз, то есть они загружаются не все в одном цикле, а скорее из сообщений, отправленных из рабочих потоков. Влияние этого без какой-либо задержки между опубликованными сообщениями можно заметить в элементе управления listview, так как щелчок правой кнопкой мыши по этому элементу управления listview никогда не показывает меню вверх, только если все элементы загружены. Каждый PostMessage/PostThreadMessage (Worker->GUI) вызовет загрузку одного элемента listview (LVM_INSERTITEM). Да, у вас есть хороший ответ, я предпочитаю отзывчивость больше, чем заботу о том, как быстро их загрузить.

Rick York

Я могу это понять. Невосприимчивый пользовательский интерфейс будет раздражать пользователей. Вы можете сделать период таймера адаптивным, отбросив его по мере заполнения очереди. Например, если у вас есть 20 или более записей, убейте таймер и воссоздайте его на 5 мс или что-то в этом роде, а если у него меньше 20 записей, то установите его на 100 мс. Эти ценности-просто шутки. Вы должны сделать их все параметры конфигурации, чтобы вы могли настроить их, чтобы получить желаемое поведение без перекомпиляции.

NoviceCoder871987

Да, спасибо, Рик. Очень хороший метод адаптивного интервала таймера. Не думал об этом. У тебя очень хорошее воображение. Я приму ваш ответ как решение.

Рейтинг:
2

KarstenK

Используйте простое SetTimer API из окон.

Совет: используйте PostThreadMessage чтобы избежать проблем с графическим интерфейсом.


Рейтинг:
1

Gerry Schmitz

Да; используйте параллельную очередь и таймер.

Параллельные Очереди C++ [^]

Простой таймер в C++ - Fluent C++[^]