|
|
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
На этом форуме параметр реестра 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-разрядных версиях). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2019, 21:06 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
DmSer, а почему бы не поменять логику при загрузке dll-ок? перед загрузкой отображаешь splash form (закрытие окна блокируешь), потом грузишь по одной dll и после загрузки каждой делаешь application.processmessages. Можно еще progressbar со статусом загрузки обновлять, чтобы юзер видел, что ничего не зависло. После загрузки всех библиотек это splash form уничтожаешь и приложение работает в обычном режиме. И не надо HungAppTimeout лишний раз трогать, ибо он не всегда доступен для изменения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2019, 23:47 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
DmSerНа этом форуме параметр реестра HungAppTimeout ещё не обсуждался, хотя странно, это довольно важный параметр, благодаря которому можно повысить надежность ПО ..... если не лезть трогать его грязными руками. DmSerВ нашем ПО есть следующая проблема: По описанию я вижу минимум три проблемы: 1. Инициализация приложения надолго грузит основной поток 2. Создаваемые окна получают неправильные настройки в результате чего возможно нарушение видимого порядка и следующие из этого артефакты поведения 3. Недостаточно квалифицированные разработчики предпочитают решать проблему методом "кувалдой в лоб" вместо того, чтобы подумать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 00:10 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
Приму к сведению, спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 00:12 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
если не лезть трогать его грязными руками. Поставил его 10000. Это решило проблему. Думаю, лучше сделать 20000. Наше ПО зависает крайне редко, но небольшие подвисания возможны. Вам известно, к каким проблемам это может привести? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 00:20 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
автор 3. Недостаточно квалифицированные разработчики предпочитают решать проблему методом "кувалдой в лоб" вместо того, чтобы подумать. Существует масса куда более важных вещей, о которых стоит подумать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 00:29 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
DmSer, delayed загрузку DLL не предлагать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 00:41 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
asviridenkovDmSer, delayed загрузку DLL не предлагать? Ваше дело предложить, наше ... Приму к сведению! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 06:39 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
Если DLL тяжелая, она и одна может хорошо так загрузить. По-хорошему, надо максимально облегчать DLLMain, выносить тяжелые действия в отдельную Init. Правда, придется во все остальные функции добавлять проверку флага - был вызван Init или нет. Либо грузить в отдельном потоке. Возможны подводные камни в зависимости от внутренностей DLL. Например, она может заводить свои глобальные переменные в TLS, тогда уже в главный поток не передашь. Тут еще надо понять, каким образом приложение должно "ответить". Вызов GetMessage? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 10:58 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
Василий 2Если DLL тяжелая, она и одна может хорошо так загрузить. Значит, если она действительно нужна такая тяжёлая, нужно внутрь неё вставить ProcessMessages. Василий 2По-хорошему, надо максимально облегчать DLLMain, выносить тяжелые действия в отдельную Init. Правда, придется во все остальные функции добавлять проверку флага - был вызван Init или нет. По-хорошему, такое надо просто выносить в ленивую инициализацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 11:32 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
softwarer 1. Инициализация приложения надолго грузит основной поток 2. Создаваемые окна получают неправильные настройки в результате чего возможно нарушение видимого порядка и следующие из этого артефакты поведения 3. Недостаточно квалифицированные разработчики предпочитают решать проблему методом "кувалдой в лоб" вместо того, чтобы подумать. Отвечу ещё раз по пунктам. 1. Инициализация действительно надолго грузит основной поток. Это происходит, если программа находится в автозагрузке и используется HDD. В этом случае помимо нашего ПО параллельно грузится ещё масса других программ, что создаёт большую нагрузку на HDD. Плюс ещё и наше ПО при загрузке много чего пишет на диск. 2. Создаются VCL-окна с параметрами "по умолчанию". Никакими левыми настройками не увлекаемся. 3. Стараемся со своей стороны делать всё возможное, чтобы в основном потоке не выполнялось тяжёлых операций. Но работа с мелкими файлами и мелкие запросы к БД в основном потоке - в большом количестве, думаю, как и у всех Delphi-программистов. У программистов C# в этом случае преимущество, т.к. можно использовать механизм async/await. 4. Речь в этой ветке должна идти не об нашей программе. Если бы я горел желанием её обсуждать, то завёл бы другую ветку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 13:02 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
DmSer, автор Инициализация действительно надолго грузит основной поток. Может быть имеет смысл сделать инициализацию в доп потоке? пусть бы основной сообщениями занимался, как положено, проблем меньше будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 13:10 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
makhaonDmSer, автор Инициализация действительно надолго грузит основной поток. Может быть имеет смысл сделать инициализацию в доп потоке? пусть бы основной сообщениями занимался, как положено, проблем меньше будет. Конечно, так было бы лучше, не спорю! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 13:32 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
DmSerИнициализация действительно надолго грузит основной поток. Значит, стоит подумать, что здесь можно смягчить. Например, так ли нужно синхронно писать "много чего" при загрузке или пойдёт асинхронная запись. Итп. DmSer2. Создаются VCL-окна с параметрами "по умолчанию". Никакими левыми настройками не увлекаемся. Не во всех версиях дельфы это хороший вариант. Иногда стоит поиграть PopupMode/PopupParent для того, чтобы добиться адекватного поведения форм. DmSer3. Стараемся со своей стороны делать всё возможное, чтобы в основном потоке не выполнялось тяжёлых операций. Но работа с мелкими файлами и мелкие запросы к БД в основном потоке - в большом количестве И они все прямо так необходимы именно при инициализации? DmSer4. Речь в этой ветке должна идти не об нашей программе. Грубые люди реагируют на такие реплики в духе "Командовать будешь своей женой". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 13:49 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
Все зависит от того, насколько возможно модифицировать эти самые DLL. Если они полностью под контролем, то можно кучу всего придумать - и заточить под фоновый поток, и добавить коллбэки, и даже внутрях запускать в фоне. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 14:36 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
Василий 2Все зависит от того, насколько возможно модифицировать эти самые DLL Для внешних DLL можно написать прокладку, находящуюся полностью под контролем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 14:40 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
Грубые люди реагируют на такие реплики в духе "Командовать будешь своей женой" Слава богу на этом форуме есть культурный человек, на которого всем нужно равняться =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 17:31 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
softwarerВасилий 2Все зависит от того, насколько возможно модифицировать эти самые DLL Для внешних DLL можно написать прокладку, находящуюся полностью под контролем. Можно, но не всегда от этого будет польза. Если DLL, к примеру, размещает свои внутренние переменные в TLS текущего потока - хоть обпрокладывайся, но передать либу после иниц-ии в главный поток будет затруднительно. Везде надо смотреть по ситуации. А ТС-а, по-моему, и так все устраивает))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2019, 17:50 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
Вот что ещё удалось выяснить: если создавать модальную форму таким образом: TMyForm.Create(nil), то при зависании (Sleep(20000)) после того как на ней появится "Не отвечает" можно будет щелкнуть на низлежащей форме и она окажется на переднем плане. Когда зависание кончится, модальное окно остаётся снизу. Если же в конструктор передавать ссылку на форму, из которой открывается модальная форма, то вся цепочка модальных форм корректно восстанавливается после окончания зависания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2019, 13:06 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
DmSerКогда зависание кончится, модальное окно остаётся снизу.Alt+Tab ее поднимет DmSerЕсли же в конструктор передавать ссылку на форму, из которой открывается модальная форма,Достаточно передать Application ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2019, 15:46 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_DmSerКогда зависание кончится, модальное окно остаётся снизу.Alt+Tab ее поднимет DmSerЕсли же в конструктор передавать ссылку на форму, из которой открывается модальная форма,Достаточно передать Application Мой тест показал, что передавать Application недостаточно. Глючит при этом реже, чем с nil. Но если передавать ссылку на форму, из которой выполняется вызов ShowModal, то сбоев вообще не возникает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2019, 11:57 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
Приветствую! Спасибо за тему! Столкнулся с аналогичной проблемой: а. Есть алгоритм, который работает 10 сек. б. И конечно в главном потоке))) Ну бывает... в. Windows 10 через 3 сек. решает, что приложение зависло и добавляет в шапку "(не отвечает)". Правда, не выводит свое дополнительное окно. г. Моя программа доделывает алгоритм и выводит сообщение - это моя форма (не штатный MessageDlg), выводимая через ShowModal. Причем в качестве AOwner передаю Application. д. Иногда (и непонятно, почему) диалоговая форма из п. г) выводится на заднем плане. В ходе разбирательств пришел к выводу, что вызов Application.ProcessMessages перед ShowModal решает проблему. В ходе тестов 1 раз на 10-20 раз мне удается получить уход на второй план диалоговой формы. Если перед ShowModal вызывать Application.ProcessMessages, то не удалось получить проблему ни разу. Понимаю, что это "кувалдой в лоб", но вроде работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2019, 14:46 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
Dimitry Timokhovдиалоговая форма из п. г) выводится на заднем плане. DisableProcessWindowsGhosting ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2019, 16:56 |
|
||
|
Параметр реестра HungAppTimeout
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Dimitry Timokhovдиалоговая форма из п. г) выводится на заднем плане. DisableProcessWindowsGhosting Смотрел DisableProcessWindowsGhosting. Ну это слишком сурово по отношению к пользователям. После вызова DisableProcessWindowsGhosting, если приложение занято, то уйдя в другое приложение, невозможно вернуть приложение ни по клику на иконке снизу, ни через Alt+TAB. Оно появится только после окончания расчета. Пользователь будет в шоке... Вот если бы "(не отвечает)" можно было заменить на "(думает)", то было бы клево))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2019, 17:53 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39835568&tid=2039271]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
50ms |
get topic data: |
8ms |
get forum data: |
3ms |
get page messages: |
80ms |
get tp. blocked users: |
2ms |
| others: | 206ms |
| total: | 374ms |

| 0 / 0 |
