Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 Параметр реестра HungAppTimeout  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 850
На этом форуме параметр реестра 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 май 19, 21:06    [21886639]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
asutp2
Member

Откуда: Тюмень
Сообщений: 510
DmSer,

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

И не надо HungAppTimeout лишний раз трогать, ибо он не всегда доступен для изменения
16 май 19, 23:47    [21886707]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 57398
Блог
DmSer
На этом форуме параметр реестра HungAppTimeout ещё не обсуждался, хотя странно, это довольно важный параметр, благодаря которому можно повысить надежность ПО

..... если не лезть трогать его грязными руками.

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

По описанию я вижу минимум три проблемы:

1. Инициализация приложения надолго грузит основной поток
2. Создаваемые окна получают неправильные настройки в результате чего возможно нарушение видимого порядка и следующие из этого артефакты поведения
3. Недостаточно квалифицированные разработчики предпочитают решать проблему методом "кувалдой в лоб" вместо того, чтобы подумать.
17 май 19, 00:10    [21886714]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 850
Приму к сведению, спасибо!
17 май 19, 00:12    [21886715]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 850
если не лезть трогать его грязными руками.

Поставил его 10000. Это решило проблему. Думаю, лучше сделать 20000. Наше ПО зависает крайне редко, но небольшие подвисания возможны.

Вам известно, к каким проблемам это может привести?
17 май 19, 00:20    [21886716]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 850
автор

3. Недостаточно квалифицированные разработчики предпочитают решать проблему методом "кувалдой в лоб" вместо того, чтобы подумать.



Существует масса куда более важных вещей, о которых стоит подумать.
17 май 19, 00:29    [21886719]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
asviridenkov
Member

Откуда:
Сообщений: 3917
DmSer,

delayed загрузку DLL не предлагать?
17 май 19, 00:41    [21886720]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 850
asviridenkov
DmSer,

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


Ваше дело предложить, наше ...
Приму к сведению!
17 май 19, 06:39    [21886772]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Василий 2
Member

Откуда:
Сообщений: 607
Если DLL тяжелая, она и одна может хорошо так загрузить. По-хорошему, надо максимально облегчать DLLMain, выносить тяжелые действия в отдельную Init. Правда, придется во все остальные функции добавлять проверку флага - был вызван Init или нет.
Либо грузить в отдельном потоке. Возможны подводные камни в зависимости от внутренностей DLL. Например, она может заводить свои глобальные переменные в TLS, тогда уже в главный поток не передашь.
Тут еще надо понять, каким образом приложение должно "ответить". Вызов GetMessage?
17 май 19, 10:58    [21887007]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 57398
Блог
Василий 2
Если DLL тяжелая, она и одна может хорошо так загрузить.

Значит, если она действительно нужна такая тяжёлая, нужно внутрь неё вставить ProcessMessages.

Василий 2
По-хорошему, надо максимально облегчать DLLMain, выносить тяжелые действия в отдельную Init. Правда, придется во все остальные функции добавлять проверку флага - был вызван Init или нет.

По-хорошему, такое надо просто выносить в ленивую инициализацию.
17 май 19, 11:32    [21887050]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 850
softwarer

1. Инициализация приложения надолго грузит основной поток
2. Создаваемые окна получают неправильные настройки в результате чего возможно нарушение видимого порядка и следующие из этого артефакты поведения
3. Недостаточно квалифицированные разработчики предпочитают решать проблему методом "кувалдой в лоб" вместо того, чтобы подумать.


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

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

Откуда: A galaxy far far away
Сообщений: 3260
DmSer,

автор
Инициализация действительно надолго грузит основной поток.
Может быть имеет смысл сделать инициализацию в доп потоке? пусть бы основной сообщениями занимался, как положено, проблем меньше будет.
17 май 19, 13:10    [21887181]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 850
makhaon
DmSer,

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


Конечно, так было бы лучше, не спорю!
17 май 19, 13:32    [21887202]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 57398
Блог
DmSer
Инициализация действительно надолго грузит основной поток.

Значит, стоит подумать, что здесь можно смягчить. Например, так ли нужно синхронно писать "много чего" при загрузке или пойдёт асинхронная запись. Итп.

DmSer
2. Создаются VCL-окна с параметрами "по умолчанию". Никакими левыми настройками не увлекаемся.

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

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

И они все прямо так необходимы именно при инициализации?

DmSer
4. Речь в этой ветке должна идти не об нашей программе.

Грубые люди реагируют на такие реплики в духе "Командовать будешь своей женой".
17 май 19, 13:49    [21887233]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Василий 2
Member

Откуда:
Сообщений: 607
Все зависит от того, насколько возможно модифицировать эти самые DLL. Если они полностью под контролем, то можно кучу всего придумать - и заточить под фоновый поток, и добавить коллбэки, и даже внутрях запускать в фоне.
17 май 19, 14:36    [21887300]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 57398
Блог
Василий 2
Все зависит от того, насколько возможно модифицировать эти самые DLL

Для внешних DLL можно написать прокладку, находящуюся полностью под контролем.
17 май 19, 14:40    [21887306]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 850
Грубые люди реагируют на такие реплики в духе "Командовать будешь своей женой"


Слава богу на этом форуме есть культурный человек, на которого всем нужно равняться =)
17 май 19, 17:31    [21887516]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Василий 2
Member

Откуда:
Сообщений: 607
softwarer
Василий 2
Все зависит от того, насколько возможно модифицировать эти самые DLL

Для внешних DLL можно написать прокладку, находящуюся полностью под контролем.

Можно, но не всегда от этого будет польза. Если DLL, к примеру, размещает свои внутренние переменные в TLS текущего потока - хоть обпрокладывайся, но передать либу после иниц-ии в главный поток будет затруднительно. Везде надо смотреть по ситуации. А ТС-а, по-моему, и так все устраивает)))
17 май 19, 17:50    [21887529]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 850
Вот что ещё удалось выяснить:
если создавать модальную форму таким образом: TMyForm.Create(nil), то при зависании (Sleep(20000)) после того как на ней появится "Не отвечает" можно будет щелкнуть на низлежащей форме и она окажется на переднем плане. Когда зависание кончится, модальное окно остаётся снизу.

Если же в конструктор передавать ссылку на форму, из которой открывается модальная форма, то вся цепочка модальных форм корректно восстанавливается после окончания зависания.
6 июн 19, 13:06    [21903416]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10998
DmSer
Когда зависание кончится, модальное окно остаётся снизу.
Alt+Tab ее поднимет
DmSer
Если же в конструктор передавать ссылку на форму, из которой открывается модальная форма,
Достаточно передать Application
6 июн 19, 15:46    [21903680]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 850
_Vasilisk_
DmSer
Когда зависание кончится, модальное окно остаётся снизу.
Alt+Tab ее поднимет
DmSer
Если же в конструктор передавать ссылку на форму, из которой открывается модальная форма,
Достаточно передать Application


Мой тест показал, что передавать Application недостаточно. Глючит при этом реже, чем с nil. Но если передавать ссылку на форму, из которой выполняется вызов ShowModal, то сбоев вообще не возникает.
7 июн 19, 11:57    [21904369]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
Приветствую!
Спасибо за тему!

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

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

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

Понимаю, что это "кувалдой в лоб", но вроде работает.
9 июл 19, 14:46    [21923480]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10998
Dimitry Timokhov
диалоговая форма из п. г) выводится на заднем плане.
DisableProcessWindowsGhosting
9 июл 19, 16:56    [21923602]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
_Vasilisk_
Dimitry Timokhov
диалоговая форма из п. г) выводится на заднем плане.

DisableProcessWindowsGhosting


Смотрел DisableProcessWindowsGhosting.

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

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

Вот если бы "(не отвечает)" можно было заменить на "(думает)", то было бы клево)))
9 июл 19, 17:53    [21923672]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47660

Dimitry Timokhov
Ну это слишком сурово по отношению к пользователям.

Значит пришло время быть суровым к себе и исправить пункт б).

Posted via ActualForum NNTP Server 1.5

9 июл 19, 18:44    [21923714]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / Delphi Ответить