Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Параметр реестра HungAppTimeout / 25 сообщений из 78, страница 1 из 4
16.05.2019, 21:06
    #39814282
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметр реестра HungAppTimeout
На этом форуме параметр реестра 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
16.05.2019, 23:47
    #39814333
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметр реестра HungAppTimeout
DmSer,

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

DisableProcessWindowsGhosting


Смотрел DisableProcessWindowsGhosting.

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

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

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

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


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