powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / not enough timers available
25 сообщений из 63, страница 1 из 3
not enough timers available
    #40120248
svd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.

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



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

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

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


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

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

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


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

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

USERProcessHandleQuota и GDIProcessHandleQuota .

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

USERProcessHandleQuota и GDIProcessHandleQuota .

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

USERProcessHandleQuota и GDIProcessHandleQuota .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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