powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / VCL + много потоков
31 сообщений из 31, показаны все 2 страниц
VCL + много потоков
    #40100043
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть приложение, в котором в эмулирую работу всяких датчиках и есть табло оператора(главная форма). Для каждого датчика на табло я создаю набор компонентов (label, memo, image) и рабочий поток. В потоке идет эмуляция изменения состояния датчика и все изменения я кидаю в очередь TObjectList. Главный поток считывает TObjectList каждого потока и отображает изменения на форме.
От основного потока редко поступают команды на датчики. Механизм передачи команд так же через TObjectList.
Когда датчиков (потоков) становиться много, то основной поток VCL не успевает все это отображать и интерфейс начинает подтормаживать.
Ткните в нужную сторону балансировки потоков
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100045
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb

Когда датчиков (потоков) становиться много, то основной поток VCL не успевает все это отображать и интерфейс начинает подтормаживать.
Ткните в нужную сторону балансировки потоков


Для отображения достаточно обновлять картинку несколько раз в секунду, промежуточные изменения выкидывать: по таймеру основной поток может брать только последнюю запись о состоянии датчика, даже если в очереди их тысяча.
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100046
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbТкните в нужную сторону балансировки потоков

Выкинуть TObjectList, изменения передавать через Message.
Выкинуть Repaint, ограничиться Invalidate.

На большее мой хрустальный шар не тянет. Облажаться в реализации взаимодействия
потоков можно слишком многими способами.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100047
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

Пусть железяку купят побыстрее. Будет лучше.
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100051
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне вот даже интересно.

В 97-м году, когда я пришёл работать на дельфу, у той конторы был комплекс программ для Московской Сотовой. Этот комплекс был написан непосредственно основателями-гендирами (оказавшимися неплохими бизнесменами, но не самыми пряморукими в части программирования, прямо скажем). И тот комплекс отлично отображал в форме, например, состояние коммутатора (насколько я помню - порядка пятисот базовых станций и полутора тысяч сот). Статус цветом, допинформация итп. С изменением практически в реальном времени.

в 97-м году. На машинах уровня Pentium 100 с 8 Mb оперативной памяти. Не самыми прямыми руками. Отлично работало.

Блин, вот сколько же должно быть этих датчиков, чтобы оно сейчас вызывало проблемы?
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100053
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если криво написать тормозить будет все что угодно.
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100056
northener
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эмулятор тоже нужно писать грамотно.
Ориентируясь на конкретные датчики.
Мне вот только одно пока не понятно. А с реальными датчиками как организуется связь?
Что это за реальные датчики, которые что-то, куда-то шлют даже если их и не просят?
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100060
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

По опыту, самое узкое место в эффективном многопоточном программировании на Delphi, это излишние обращения к блокировочному менеджеру памяти. Ставишь точку прерывания на System._GetNem() и тебе многое станет ясно.
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100068
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad Fсамое узкое место в эффективном многопоточном программировании на Delphi, это
излишние обращения к блокировочному менеджеру памяти.

Только если ты слишком интенсивно используешь типы и классы, обращающиеся к нему
типа String или TObjectList.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100070
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

То есть, как раз то, на чем и построен весь обмен в данном случае.
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100105
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x1ca4064, согласен. учту
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100107
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, переделаю на postmessage. посмотрю результат
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100108
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer, то что криво написано как бы ясно из-за тормозом, спасибо кэп
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100109
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Vlad Fсамое узкое место в эффективном многопоточном программировании на Delphi, это
излишние обращения к блокировочному менеджеру памяти.

Только если ты слишком интенсивно используешь типы и классы, обращающиеся к нему
типа String или TObjectList.


да, так и есть. от String не куда не денешься. логирование работы и ошибок на экране бегает
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100112
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
northener, связь по http
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100113
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbот String не куда не денешься. логирование работы и ошибок на экране бегает

Для него достаточно ShortString. А вот TMemo, да ещё и с удалением старых строк
- реально тормоз, да.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100121
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
Dimitry Sibiryakov, переделаю на postmessage. посмотрю результат


Почему нельзя раз в 100 мс опрашивать эту толпу потоков и отображать состояние на экране?
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100123
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

Это было бы слишком просто.
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100125
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И неэффективно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100126
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Не правда.
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100127
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это может быть эффективно если отображаемое состояние изменяется с частотой,
превосходящей частоту кадровой развёртки. Тогда можно пропускать некоторые
события, поскольку они всё равно не отрисуются нормально.

Десять раз в секунду рендерить состояние, не успевшее измениться - неэффективно,
лучше таки подождать сигнала о его изменении, чем греть воздух, переливая из
пустого в порожнее.

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

Где именно лежит случай аффтара - мой ХШ не показывает. Но "http" как бы
намекает, что нормальный код ещё и поспать успеет между пакетами.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100128
northener
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cptngrb
northener, связь по http

С датчиками? По http?
Первый раз слышу. Ссылку можно попросить на конкретный датчик?
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100129
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Ловить и обрабатывать перерисовку от N событий, от каждого датчика отдельно, по любому дольше, чем 1 раз в M мсек перерисовывать все изменившиеся датчики разом.
И, как минимум, предсказуемей по производительности.

Перерисовывать то что не изменилось? Зачем?
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100136
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
cptngrb
Dimitry Sibiryakov, переделаю на postmessage. посмотрю результат


Почему нельзя раз в 100 мс опрашивать эту толпу потоков и отображать состояние на экране?


Сейчас так и есть. Но то ли я спрашиваю не так эту толпу, то ли отображение на экране. Буду смотреть
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100144
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Экран достаточно обновлять 1-2 раза/сек.
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100160
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Десять раз в секунду рендерить состояние, не успевшее измениться - неэффективно,
лучше таки подождать сигнала о его изменении, чем греть воздух, переливая из
пустого в порожнее.
Лучше сделать и то и другое.
При изменении данных взводить какие-то флаги, по таймеру их проверять и перерисовывать при необходимости.
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100162
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
northener
cptngrb
northener, связь по http

С датчиками? По http?
Первый раз слышу. Ссылку можно попросить на конкретный датчик?


да это эмулятор, модель поведения. Мне сами модели датчиков и для чего это не очень интересно. Я нагрузку сервака таким образом проверяю. Сколько он выдержит запрос и т.п. и т.д.
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100163
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис
Dimitry Sibiryakov

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


Что-то похожее и сделал в итоге. Вроде нормально крутиться
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100164
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо за советы
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100171
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисПри изменении данных взводить какие-то флаги, по таймеру их проверять и
перерисовывать при необходимости.

Вопрос в частоте таймера. Некоторым не нравится FPS lock, им подавай честные 120
кадров в секунду (типа, зря они супер-пупер монитор с такой частотой покупали).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
VCL + много потоков
    #40100181
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Вопрос в частоте таймера
Это зависит от того, насколько нагружена процедура обновления/отрисовки.
Для таких "некоторых" можно настраиваемым параметром сделать.
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / VCL + много потоков
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]