Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / not enough timers available / 25 сообщений из 63, страница 1 из 3
15.12.2021, 15:03
    #40120248
svd
svd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
Всем привет.

Очень большой проект, с кучей юнитов и компонентов. Думаю по этому глупо приводить здесь код.
На формах и фреймах лежат созданные в дизайнере TTimer. Фреймы создаются "вручную" и добавляются на форму в единичном экземпляре. Сооствественно объекты TTimer тоже создаются не в множественном числе, без create/free. Всего таймеров в проекте 18.
И вот меняя все лишь порядок создания фреймов вываливается исключение 'not enough timers available'. происходит это при попытке включения таймера:
Код: pascal
1.
2.
  if not TimerAus.Enabled then
    TimerAus.Enabled := True;



Кто-нибудь знает причину, почему такое это может происходить и вообще как это можно побороть, кроме замены таймеров на tthread?
...
Рейтинг: 0 / 0
15.12.2021, 15:31
    #40120267
Bred eFeM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
svd, ты часы на руке носишь? больше одной штуки? или как?
...
Рейтинг: 0 / 0
15.12.2021, 15:39
    #40120274
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
Я бы поставил логирующий брякпоинт на создание таймера и проверил, что код вызывается в самом деле 18 раз, а не 1800
...
Рейтинг: 0 / 0
15.12.2021, 15:50
    #40120279
svd
svd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
Fr0sT-Brutal,

авторЯ бы поставил логирующий брякпоинт на создание таймера и проверил, что код вызывается в самом деле 18 раз, а не 1800

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


Bred eFeMsvd, ты часы на руке носишь? больше одной штуки? или как?
я вообще не ношу, я счастливый.
...
Рейтинг: 0 / 0
15.12.2021, 17:36
    #40120326
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
То есть ты уверен, что таймеров именно ожидаемое кол-во? Попробуй еще в ProcessExplorer или в диспетчере задач хендлы проверить
...
Рейтинг: 0 / 0
15.12.2021, 18:17
    #40120349
svd
svd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
Fr0sT-Brutal,

А что там можно проверить?

Тут в одном описании попалась попытка, разъясняющая ситуацию. У парнишки было около 400 таймеров на различных формах и ошибка тоже случалась при включении. Объясняли это тем, что в очереди текущего окна уже есть сообшеня WM_TIMER и ощибка просодит во время TTimer.Update(). В процедуре ничего нет особо криминиального, что можно из дельфи проковырять: обращение к Windows.SetTimer(). попробовал перед вызовом сделать Application.ProcessMessages, но это не помогает.
...
Рейтинг: 0 / 0
15.12.2021, 18:25
    #40120353
svd
svd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
Fr0sT-Brutal
То есть ты уверен, что таймеров именно ожидаемое кол-во? Попробуй еще в ProcessExplorer или в диспетчере задач хендлы проверить


приложение Win64, handles = 16289. Это x3FA. Вроде не должно быть ограничений на хэндлы. Или я что то не знаю?
...
Рейтинг: 0 / 0
15.12.2021, 18:35
    #40120358
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
svdВроде не должно быть ограничений на хэндлы. Или я что то не знаю?

Приложение по-прежнему не может иметь больше 16к окон одновременно. Такое
количество окон просто не имеет смысла, поэтому и лимит никто не увеличивает с
прошлого века.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.12.2021, 18:59
    #40120372
Maxim Rusov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
Более того - координаты объектов GDI по прежнему 16-ти разрядные и не могут превышать 32K. Приятно, когда в большом отчете объекты отскролившиеся далеко "вверх" начинают вылезать снизу. "Привет, это снова мы" :)
...
Рейтинг: 0 / 0
15.12.2021, 19:18
    #40120382
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
Скроллить такой отчёт по пикселю в любом случае стрёмно...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.12.2021, 21:39
    #40120413
svd
svd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
Большое спасибо за предупреждение по поводу хэндлов. Можно ли проблему ограничения количества решить перенесением части графических форм и фреймов в динамическую библиотеку?
...
Рейтинг: 0 / 0
15.12.2021, 21:53
    #40120415
svd
svd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
нашел в реджистри два ключа:

USERProcessHandleQuota и GDIProcessHandleQuota .

Знает кто-нибудь про это, будет ли решением проблемы?
...
Рейтинг: 0 / 0
15.12.2021, 21:57
    #40120420
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
svd
Большое спасибо за предупреждение по поводу хэндлов. Можно ли проблему ограничения количества решить перенесением части графических форм и фреймов в динамическую библиотеку?
Нет, они на процесс
...
Рейтинг: 0 / 0
15.12.2021, 21:59
    #40120422
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
Решением проблемы будет нормальная архитектура приложения, ну или хотя бы динамическое создание и освобождение используемых ресурсов. За каким хреном одновременно создавать столько отжирающих ресурсов форм и фреймов?
...
Рейтинг: 0 / 0
15.12.2021, 22:00
    #40120423
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
svd
нашел в реджистри два ключа:

USERProcessHandleQuota и GDIProcessHandleQuota .

Знает кто-нибудь про это, будет ли решением проблемы?
Нет, решением проблемы будет только нахождение утечки хэндлов.
...
Рейтинг: 0 / 0
15.12.2021, 22:00
    #40120424
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
svd
нашел в реджистри два ключа:

USERProcessHandleQuota и GDIProcessHandleQuota .

Знает кто-нибудь про это, будет ли решением проблемы?
Нет, решением проблемы будет только нахождение утечки хэндлов.
...
Рейтинг: 0 / 0
15.12.2021, 22:05
    #40120425
svd
svd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
white_nigger...хотя бы динамическое создание и освобождение используемых ресурсов.

чесно говоря, я постоянно задаю этот вопрос. Но шеф утверждает, что обязательное требование.

YuRockНет, решением проблемы будет только нахождение утечки хэндлов.

да, после перезагрузки с таймером это проблему не решило. Остается только жесткое порно в виде поиска кривизны.
...
Рейтинг: 0 / 0
15.12.2021, 22:23
    #40120427
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
svd,

как уже сказано в 22409947 , нафига тебе столько таймеров ?

Достаточно одного.
...
Рейтинг: 0 / 0
15.12.2021, 22:43
    #40120433
svd
svd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
Aleksandr Sharahov,

таймеры используются для разных целей. Один все время контролирует протокол выполнения и ошибок и записывет даннве в файл. Другой, например, контролирует в ните ручного сканера наличие новых данных и вытягивет их оттуда. Причем в зависимости от фрейма обработка этих данных идет поразному - в одном случае это могут быть данные товара, в другом места или какого либо бокса со вспомогательным кодом. Причем с таким механизмом, имея один скэнер и одну нить по его обработке, данные скэнера можно использовать даже между разными программами.
Третий контролирует состояние двери у робота и синхронизирует эти данные между парой других программ.
и т.д. по поводу специфических таймеров.
Но есть и довольно тупые задачи для таймеров: например при запросе какого либо поиска данных или просто фетчинг этих данных, запрос выполняется в отдельной нити, а данные из нити вытягиваются по таймеру в компоненты типа AdvSmoothListBox, или раз в секунду обновляет данные со значением из базы для таких компонентов. Такие можно как раз озадачиться и объединить в один.

За 8 лет разработки именно этой части кода, просто так такую проблему не решить - очень сильные изменения придется вносить в фремворк. А потом еще непонятно сколько тестировать под разными конфигурациями у клиентов - у одних один набор фич отображается, у других другое.
...
Рейтинг: 0 / 0
15.12.2021, 22:47
    #40120435
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
svd
Aleksandr Sharahov,

таймеры используются для разных целей. Один все время контролирует протокол выполнения и ошибок и записывет даннве в файл. Другой, например, контролирует в ните ручного сканера наличие новых данных и вытягивет их оттуда. Причем в зависимости от фрейма обработка этих данных идет поразному - в одном случае это могут быть данные товара, в другом места или какого либо бокса со вспомогательным кодом. Причем с таким механизмом, имея один скэнер и одну нить по его обработке, данные скэнера можно использовать даже между разными программами.
Третий контролирует состояние двери у робота и синхронизирует эти данные между парой других программ.
и т.д. по поводу специфических таймеров.
Но есть и довольно тупые задачи для таймеров: например при запросе какого либо поиска данных или просто фетчинг этих данных, запрос выполняется в отдельной нити, а данные из нити вытягиваются по таймеру в компоненты типа AdvSmoothListBox, или раз в секунду обновляет данные со значением из базы для таких компонентов. Такие можно как раз озадачиться и объединить в один.

За 8 лет разработки именно этой части кода, просто так такую проблему не решить - очень сильные изменения придется вносить в фремворк. А потом еще непонятно сколько тестировать под разными конфигурациями у клиентов - у одних один набор фич отображается, у других другое.
И что, таких таймеров 16000 накопилось? Не верю.
И хэндлы - это не только таймеры. Ты можешь "терять" и окна, и эвенты, и файлы, сокеты, к.секции, мьютексы, семафоры... Всё, что угодно.
...
Рейтинг: 0 / 0
15.12.2021, 23:02
    #40120437
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
Запусти ты уже, наконец-то, в каком-нибудь профайлере свою прогу и закрой через время - он покажет, какие ресурсы не удалены.
...
Рейтинг: 0 / 0
15.12.2021, 23:20
    #40120444
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
svdтаймеры используются для разных целей. Один все время контролирует протокол
выполнения и ошибок и записывет даннве в файл. Другой, например, контролирует в
ните ручного сканера наличие новых данных и вытягивет их оттуда.

На это всё достаточно одного таймера, который по истечению заданного периода
запускает ту или иную функцию.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.12.2021, 00:03
    #40120449
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
Вангую что заменить его 18 таймеров на 1 не поможет.

Видимо их далеко не 18.
...
Рейтинг: 0 / 0
16.12.2021, 00:17
    #40120451
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
rgreat
Вангую что заменить его 18 таймеров на 1 не поможет.

Видимо их далеко не 18.
Он же показывал, что >16к хэндлов в списке процессов отображается. Там тихий ужас какой-то.
...
Рейтинг: 0 / 0
16.12.2021, 10:20
    #40120507
svd
svd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
not enough timers available
YuRockЗапусти ты уже, наконец-то, в каком-нибудь профайлере свою прогу и закрой через время - он покажет, какие ресурсы не удалены.

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

Но в этом случае fastmm не сообщает ничего полезного.

Dimitry SibiryakovНа это всё достаточно одного таймера, который по истечению заданного периода
запускает ту или иную функцию.

Не всегда. И не везде. Есть задачи, которые очень критичны ко времени обработки. И если в такой ситуации таймер с интервалом 800мс проводит обработку свое функции 1.5 сек. - это ненормально.

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

YuRockОн же показывал, что >16к хэндлов в списке процессов отображается. Там тихий ужас какой-то.

Правильно заметил - в тасклисте не только таймеры отображаются, а все хэндлы, используемые приложением.
Но почему именно этот конкретный таймер чудит - сегодня буду разбираться. Причем в правиле фреймворка стоит, что при деактивации фрейма, таймера и вспомогательный трэд останавливаются, а при активации запускаются заново. И именно этот таймер при новом запуске бросает тоже самое исключение, а вот на других фреймах, где подобная реализация, такого не происходит.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / not enough timers available / 25 сообщений из 63, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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