powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Параметр реестра HungAppTimeout
25 сообщений из 78, страница 1 из 4
Параметр реестра HungAppTimeout
    #39814282
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На этом форуме параметр реестра HungAppTimeout ещё не обсуждался, хотя странно, это довольно важный параметр, благодаря которому можно повысить надежность ПО, которое многие из нас разрабатывают для коммерческого использования.
В нашем ПО есть следующая проблема: при запуске программы в основном потоке загружаются десятки DLL-библиотек, зачастую время их загрузки превышает 5 секунд. Это время зависит прежде всего от того, чем занят HDD (с SSD такой проблемы нет). Если HDD ничем не загружен, то библиотеки грузятся быстро (в 5 секунд вполне укладываются), но если HDD нагружен другими задачами, то DLL могут грузиться дольше в разы.
В том случае, если на экране открылось окно, а затем основной поток не успел выполнить свои задачи за 5 секунд, Windows вешает дополнительное окно с надписью "не отвечает". После того, как подвисание заканчивается, Windows убирает своё окно. Такие манипуляции с окнами в нашем случае приводят к тому, что иногда окно, с которым взаимодействует пользователь, улетает на задний план (не важно, в каком режиме оно было открыто: Show или ShowModal). В отдельный случаях пользователи даже умудряются закрыть окно, поверх которого открыто модальное окно, уехавшее на задний план (это может приводить к Access Violation). В случае терминала самообслуживания получается такой эффект: пользователь (водитель) видит служебное окно, а не то окно, которое рисуется для него.

Лично я считаю, что таймаут в 5 секунд является слишком маленьким и допустимым только на компьютере разработчика. Вреда от такого преждевременного детектирования и манипуляции окнами гораздо больше, чем пользы. Думаю, нормальное значение должно быть не менее 20 секунд.

Параметр HungAppTimeout содержит количество миллисекунд, является текстовым и живёт в разделе "HKEY_CURRENT_USER\Control Panel\Desktop". Применяется после перелогина. Работает по всех версиях Windows (проверял я его на 32-разрядных версиях).
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39814333
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

а почему бы не поменять логику при загрузке dll-ок? перед загрузкой отображаешь splash form (закрытие окна блокируешь), потом грузишь по одной dll и после загрузки каждой делаешь application.processmessages. Можно еще progressbar со статусом загрузки обновлять, чтобы юзер видел, что ничего не зависло. После загрузки всех библиотек это splash form уничтожаешь и приложение работает в обычном режиме.

И не надо HungAppTimeout лишний раз трогать, ибо он не всегда доступен для изменения
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39814337
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerНа этом форуме параметр реестра HungAppTimeout ещё не обсуждался, хотя странно, это довольно важный параметр, благодаря которому можно повысить надежность ПО
..... если не лезть трогать его грязными руками.

DmSerВ нашем ПО есть следующая проблема:
По описанию я вижу минимум три проблемы:

1. Инициализация приложения надолго грузит основной поток
2. Создаваемые окна получают неправильные настройки в результате чего возможно нарушение видимого порядка и следующие из этого артефакты поведения
3. Недостаточно квалифицированные разработчики предпочитают решать проблему методом "кувалдой в лоб" вместо того, чтобы подумать.
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39814338
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приму к сведению, спасибо!
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39814339
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если не лезть трогать его грязными руками.
Поставил его 10000. Это решило проблему. Думаю, лучше сделать 20000. Наше ПО зависает крайне редко, но небольшие подвисания возможны.

Вам известно, к каким проблемам это может привести?
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39814342
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
3. Недостаточно квалифицированные разработчики предпочитают решать проблему методом "кувалдой в лоб" вместо того, чтобы подумать.



Существует масса куда более важных вещей, о которых стоит подумать.
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39814343
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

delayed загрузку DLL не предлагать?
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39814365
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovDmSer,

delayed загрузку DLL не предлагать?

Ваше дело предложить, наше ...
Приму к сведению!
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39814482
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если DLL тяжелая, она и одна может хорошо так загрузить. По-хорошему, надо максимально облегчать DLLMain, выносить тяжелые действия в отдельную Init. Правда, придется во все остальные функции добавлять проверку флага - был вызван Init или нет.
Либо грузить в отдельном потоке. Возможны подводные камни в зависимости от внутренностей DLL. Например, она может заводить свои глобальные переменные в TLS, тогда уже в главный поток не передашь.
Тут еще надо понять, каким образом приложение должно "ответить". Вызов GetMessage?
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39814507
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2Если DLL тяжелая, она и одна может хорошо так загрузить.
Значит, если она действительно нужна такая тяжёлая, нужно внутрь неё вставить ProcessMessages.

Василий 2По-хорошему, надо максимально облегчать DLLMain, выносить тяжелые действия в отдельную Init. Правда, придется во все остальные функции добавлять проверку флага - был вызван Init или нет.
По-хорошему, такое надо просто выносить в ленивую инициализацию.
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39814559
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
1. Инициализация приложения надолго грузит основной поток
2. Создаваемые окна получают неправильные настройки в результате чего возможно нарушение видимого порядка и следующие из этого артефакты поведения
3. Недостаточно квалифицированные разработчики предпочитают решать проблему методом "кувалдой в лоб" вместо того, чтобы подумать.

Отвечу ещё раз по пунктам.

1. Инициализация действительно надолго грузит основной поток. Это происходит, если программа находится в автозагрузке и используется HDD. В этом случае помимо нашего ПО параллельно грузится ещё масса других программ, что создаёт большую нагрузку на HDD. Плюс ещё и наше ПО при загрузке много чего пишет на диск.
2. Создаются VCL-окна с параметрами "по умолчанию". Никакими левыми настройками не увлекаемся.
3. Стараемся со своей стороны делать всё возможное, чтобы в основном потоке не выполнялось тяжёлых операций. Но работа с мелкими файлами и мелкие запросы к БД в основном потоке - в большом количестве, думаю, как и у всех Delphi-программистов. У программистов C# в этом случае преимущество, т.к. можно использовать механизм async/await.
4. Речь в этой ветке должна идти не об нашей программе. Если бы я горел желанием её обсуждать, то завёл бы другую ветку.
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39814565
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

автор Инициализация действительно надолго грузит основной поток.
Может быть имеет смысл сделать инициализацию в доп потоке? пусть бы основной сообщениями занимался, как положено, проблем меньше будет.
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39814579
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonDmSer,

автор Инициализация действительно надолго грузит основной поток.
Может быть имеет смысл сделать инициализацию в доп потоке? пусть бы основной сообщениями занимался, как положено, проблем меньше будет.

Конечно, так было бы лучше, не спорю!
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39814594
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerИнициализация действительно надолго грузит основной поток.
Значит, стоит подумать, что здесь можно смягчить. Например, так ли нужно синхронно писать "много чего" при загрузке или пойдёт асинхронная запись. Итп.

DmSer2. Создаются VCL-окна с параметрами "по умолчанию". Никакими левыми настройками не увлекаемся.
Не во всех версиях дельфы это хороший вариант. Иногда стоит поиграть PopupMode/PopupParent для того, чтобы добиться адекватного поведения форм.

DmSer3. Стараемся со своей стороны делать всё возможное, чтобы в основном потоке не выполнялось тяжёлых операций. Но работа с мелкими файлами и мелкие запросы к БД в основном потоке - в большом количестве
И они все прямо так необходимы именно при инициализации?

DmSer4. Речь в этой ветке должна идти не об нашей программе.
Грубые люди реагируют на такие реплики в духе "Командовать будешь своей женой".
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39814632
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все зависит от того, насколько возможно модифицировать эти самые DLL. Если они полностью под контролем, то можно кучу всего придумать - и заточить под фоновый поток, и добавить коллбэки, и даже внутрях запускать в фоне.
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39814635
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2Все зависит от того, насколько возможно модифицировать эти самые DLL
Для внешних DLL можно написать прокладку, находящуюся полностью под контролем.
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39814752
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Грубые люди реагируют на такие реплики в духе "Командовать будешь своей женой"

Слава богу на этом форуме есть культурный человек, на которого всем нужно равняться =)
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39814759
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerВасилий 2Все зависит от того, насколько возможно модифицировать эти самые DLL
Для внешних DLL можно написать прокладку, находящуюся полностью под контролем.
Можно, но не всегда от этого будет польза. Если DLL, к примеру, размещает свои внутренние переменные в TLS текущего потока - хоть обпрокладывайся, но передать либу после иниц-ии в главный поток будет затруднительно. Везде надо смотреть по ситуации. А ТС-а, по-моему, и так все устраивает)))
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39823405
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что ещё удалось выяснить:
если создавать модальную форму таким образом: TMyForm.Create(nil), то при зависании (Sleep(20000)) после того как на ней появится "Не отвечает" можно будет щелкнуть на низлежащей форме и она окажется на переднем плане. Когда зависание кончится, модальное окно остаётся снизу.

Если же в конструктор передавать ссылку на форму, из которой открывается модальная форма, то вся цепочка модальных форм корректно восстанавливается после окончания зависания.
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39823552
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerКогда зависание кончится, модальное окно остаётся снизу.Alt+Tab ее поднимет
DmSerЕсли же в конструктор передавать ссылку на форму, из которой открывается модальная форма,Достаточно передать Application
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39823941
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_DmSerКогда зависание кончится, модальное окно остаётся снизу.Alt+Tab ее поднимет
DmSerЕсли же в конструктор передавать ссылку на форму, из которой открывается модальная форма,Достаточно передать Application

Мой тест показал, что передавать Application недостаточно. Глючит при этом реже, чем с nil. Но если передавать ссылку на форму, из которой выполняется вызов ShowModal, то сбоев вообще не возникает.
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39835496
Dimitry Timokhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую!
Спасибо за тему!

Столкнулся с аналогичной проблемой:
а. Есть алгоритм, который работает 10 сек.
б. И конечно в главном потоке))) Ну бывает...
в. Windows 10 через 3 сек. решает, что приложение зависло и добавляет в шапку "(не отвечает)". Правда, не выводит свое дополнительное окно.
г. Моя программа доделывает алгоритм и выводит сообщение - это моя форма (не штатный MessageDlg), выводимая через ShowModal. Причем в качестве AOwner передаю Application.
д. Иногда (и непонятно, почему) диалоговая форма из п. г) выводится на заднем плане.

В ходе разбирательств пришел к выводу, что вызов Application.ProcessMessages перед ShowModal решает проблему.

В ходе тестов 1 раз на 10-20 раз мне удается получить уход на второй план диалоговой формы.
Если перед ShowModal вызывать Application.ProcessMessages, то не удалось получить проблему ни разу.

Понимаю, что это "кувалдой в лоб", но вроде работает.
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39835568
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Timokhovдиалоговая форма из п. г) выводится на заднем плане. DisableProcessWindowsGhosting
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39835616
Dimitry Timokhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_Dimitry Timokhovдиалоговая форма из п. г) выводится на заднем плане.

DisableProcessWindowsGhosting


Смотрел DisableProcessWindowsGhosting.

Ну это слишком сурово по отношению к пользователям.
После вызова DisableProcessWindowsGhosting, если приложение занято, то уйдя в другое приложение, невозможно вернуть приложение ни по клику на иконке снизу, ни через Alt+TAB. Оно появится только после окончания расчета.

Пользователь будет в шоке...

Вот если бы "(не отвечает)" можно было заменить на "(думает)", то было бы клево)))
...
Рейтинг: 0 / 0
Параметр реестра HungAppTimeout
    #39835645
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry TimokhovНу это слишком сурово по отношению к пользователям.

Значит пришло время быть суровым к себе и исправить пункт б).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 78, страница 1 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Параметр реестра HungAppTimeout
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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