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

Откуда: Пенза
Сообщений: 892
На этом форуме параметр реестра 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

Откуда: Тюмень
Сообщений: 545
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
Сообщений: 58951
Блог
DmSer
На этом форуме параметр реестра HungAppTimeout ещё не обсуждался, хотя странно, это довольно важный параметр, благодаря которому можно повысить надежность ПО

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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


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

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

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

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

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

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

Откуда: Пенза
Сообщений: 892
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
Сообщений: 3370
DmSer,

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

Откуда: Пенза
Сообщений: 892
_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

Откуда: Украина, Харьков
Сообщений: 11196
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

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

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

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

Posted via ActualForum NNTP Server 1.5

9 июл 19, 18:44    [21923714]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
Dimitry Sibiryakov, когда сами MS исправят свой Excel (у меня 365) так, что при открытии больших-больших файлов в шапке не показывается "(не отвечает)", тогда и я поправлю))))

Совет хороший и правильный. Учту!
9 июл 19, 18:51    [21923725]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Sibiryakov
Member

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

Круговая порука рукожопов, да простит меня Рустам...

Posted via ActualForum NNTP Server 1.5

9 июл 19, 18:55    [21923726]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
Dimitry Sibiryakov, полностью поддерживаю - Excel'ю 30 лет, а никак в отдельный потом загрузку не вынесут. И пресловутую ошибку с _FilterDatabase до сих пор не исправят, и не сделают штатную возможность выставления ширины колонок в миллиметрах...

Но также интересно, неужели в программах Дмитрия Сибирякова весь ввод/вывод вынесен в отдельный поток? И даже из файлов чтение в отдельном потоке (там тоже может подвиснуть внешнее устройство)? И с БД работа вся асинхронная?
9 июл 19, 19:08    [21923735]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Sibiryakov
Member

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

Dimitry Timokhov
И с БД работа вся асинхронная?

Ты не поверишь...

Posted via ActualForum NNTP Server 1.5

9 июл 19, 19:13    [21923742]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
Dimitry Sibiryakov, у меня нет оснований тебе не верить.

Я, конечно, "закис" в своем приложении, когда сервер с локальной гигабитной сети. И мелочь при обращении к серверу поточить смысла просто нет. Отчеты вот надо отпоточить. В планах стоит.

Интересно, что у тебя за приложение, в котором тотальное асинхронное общение с БД? Что за тип приложения? Чем технически это делаешь? Своя библиотека или штатными средствами Delphi пользуешься? Расскажи, плз, интересно же. Первый раз встречаю приложение на Delphi с полностью асинхронным взаимодействием с БД.
9 июл 19, 20:55    [21923791]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Sibiryakov
Member

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

Dimitry Timokhov
Чем технически это делаешь?

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

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

Posted via ActualForum NNTP Server 1.5

9 июл 19, 21:12    [21923796]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
Dimitry Sibiryakov
Dimitry Timokhov
Чем технически это делаешь?

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

А когда выполняешь любую процедуру (БД?) в фоне, чем к БД коннектишься?
И интересно, как прогресс определяешь?
9 июл 19, 21:34    [21923804]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Sibiryakov
Member

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

Dimitry Timokhov
А когда выполняешь любую процедуру (БД?) в фоне, чем к БД коннектишься?

Используется основной (единственный) коннект. Прогресс - по этапам обработки.

Posted via ActualForum NNTP Server 1.5

9 июл 19, 22:10    [21923818]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
Dimitry Sibiryakov
Dimitry Timokhov
А когда выполняешь любую процедуру (БД?) в фоне, чем к БД коннектишься?

Используется основной (единственный) коннект. Прогресс - по этапам обработки.


Ок. Понятно. Всё логично.

У меня тоже есть некоторые долгие запросы к БД в доп. потоке. Использую ADO, синхронно. Сам импортировал OLE либу (т.е. стандартными компонентами не пользуюсь). Даже, если бы пользовался асинхроном ADO, то там все равно нет А) прогресса и Б) не прервешь (я не нашел). Т.к. ADO по определению имеет потоковую модель apartment, а не multithreaded, то долгие запросы делаю в отдельном коннекте, т.к. не могу использовать один ADODB.Connection из двух потоков.

Критично то, что замирание на 5+ сек есть во встроенном скриптовом языке. На это я повлиять не могу. Пишут прикладные разработчики. Там есть и GUI и вычисления... Там уж не распоточишь это дело легко.

Собственно, поэтому и влез в топик. Чтобы понять и разобраться с режимом Ghost, в который Windows принудительно переводит любое приложение через 5 сек, если то не вызывает PeekMessage или аналоги.
9 июл 19, 22:49    [21923839]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Василий 2
Member

Откуда:
Сообщений: 757
Dimitry Timokhov
Чтобы понять и разобраться с режимом Ghost, в который Windows принудительно переводит любое приложение через 5 сек, если то не вызывает PeekMessage или аналоги.

Собственно, если проверяется просто вызов Peek/GetMessage, то запуск фонового потока, создающего невидимое окно и таймер и крутящего цикл выборки сообщений, решит проблему "призракизации". А если это окно будет видимо, и будет показывать симпатичную анимашку или просто прогресс-бар, так совсем хорошо
10 июл 19, 18:08    [21924358]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Василий 2
Member

Откуда:
Сообщений: 757
Только никакого VCL в фоновом потоке! Только WinAPI. Если CreateWindow слишком лениво, то помогут диалоги из ресурсов
10 июл 19, 18:09    [21924360]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
Василий 2
Dimitry Timokhov
Чтобы понять и разобраться с режимом Ghost, в который Windows принудительно переводит любое приложение через 5 сек, если то не вызывает PeekMessage или аналоги.

Собственно, если проверяется просто вызов Peek/GetMessage, то запуск фонового потока, создающего невидимое окно и таймер и крутящего цикл выборки сообщений, решит проблему "призракизации". А если это окно будет видимо, и будет показывать симпатичную анимашку или просто прогресс-бар, так совсем хорошо


Погоди))

Правильно я понимаю, что ты говоришь о том, можно PeekMessage делать в доп. потоке для окна, созданного средствами WinAPI в этом потоке, и этого будет достаточно, чтобы Windows не перевел *все* приложение в режим ghost?

Иными словами, ты считаешь, что достаточно делать PeekMessage в *любом* потоке процесса, а не обязательно в главном (первом) потоке?
10 июл 19, 18:19    [21924370]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 58951
Блог
Dimitry Sibiryakov
Один юнит размером в три экрана, который выполняет любую процедуру в фоне, сопровождая это модальным окном прогресса.

А смысл? Ну то есть вот есть некий запрос, который открывается десять секунд. В чём преимущество открывать его в фоне, закрыв модальным окном, по сравнению с crSQLWait в основном потоке?
10 июл 19, 18:29    [21924374]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5215
Dimitry Timokhov,

правильно, но хоть какое-то окно должно быть видимо, так как кто-то должен обрабатывать сообщения
10 июл 19, 18:34    [21924375]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
softwarer
А смысл? Ну то есть вот есть некий запрос, который открывается десять секунд. В чём преимущество открывать его в фоне, закрыв модальным окном, по сравнению с crSQLWait в основном потоке?

Не мне, но предположу.
Так все равно же в "(не отвечает)" впадает главная форма.
10 июл 19, 18:38    [21924377]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 58951
Блог
Dimitry Timokhov
Так все равно же в "(не отвечает)" впадает главная форма.

Для этого нужно куда больше времени. Столько, что и в форме "модального окна с прогрессом" пользователя не устроит (во всяком случае, меня бы не устроило).
10 июл 19, 18:45    [21924385]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
kealon(Ruslan),
Василий 2,

В общем проверил:
1. Создал окно на WinAPI (выбрал из другого своего проекта). Оно живое, обрабатывает очередь. Даже перерисовывается.
2. Все равно - через 5 сек в главном окне появляется "(не отвечает)".

Вывод - Windows анализирует очередь главного (первого) потока. А не всех, которые принадлежат процессу.
10 июл 19, 18:52    [21924390]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Sibiryakov
Member

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

softwarer
Ну то есть вот есть некий запрос, который открывается десять секунд. В чём преимущество
открывать его в фоне, закрыв модальным окном, по сравнению с crSQLWait в основном потоке?

1) Приложение не впадает в статус "Не отвечает", как уже сказали.
2) Окна не становятся белыми если провести над ними другое окно (переключиться на другое
приложение). Что, собственно, следствие п.1.

Posted via ActualForum NNTP Server 1.5

10 июл 19, 18:52    [21924391]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Sibiryakov
Member

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

softwarer
по сравнению с crSQLWait в основном потоке?

А если ты имеешь ввиду запустить запрос в фоне, а в главном потоке всего лишь сменить
курсор, то это, конечно, тоже неплохо, но придётся отдельно заботиться о том, чтобы
пользователь этим курсором не тыкал куда не надо. А мне лень. ShowModal отбивает
возможность "потыкать" автоматически.

Posted via ActualForum NNTP Server 1.5

10 июл 19, 19:03    [21924396]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 58951
Блог
Dimitry Sibiryakov
1) Приложение не впадает в статус
2) Окна не становятся белыми

Ясно. Мне эти соображения представляются важными, когда время открытия запроса измеряется минутами. Ради секунд я не стал бы заморачиваться. За десять секунд условный пользователь не особо успеет переключиться в другое приложение, схватить его окно и начать таскать над первым даже если предположить, что ему вдруг зачем-то понадобилось это сделать.
10 июл 19, 19:35    [21924406]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Василий 2
Member

Откуда:
Сообщений: 757
Dimitry Timokhov
kealon(Ruslan),
Василий 2,

В общем проверил:
1. Создал окно на WinAPI (выбрал из другого своего проекта). Оно живое, обрабатывает очередь. Даже перерисовывается.
2. Все равно - через 5 сек в главном окне появляется "(не отвечает)".

Вывод - Windows анализирует очередь главного (первого) потока. А не всех, которые принадлежат процессу.

Любопытно, хотя и странно. Какое дело Винде, какой там из потоков главный...
11 июл 19, 11:30    [21924694]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
Василий 2
Dimitry Timokhov
kealon(Ruslan),
Василий 2,

В общем проверил:
1. Создал окно на WinAPI (выбрал из другого своего проекта). Оно живое, обрабатывает очередь. Даже перерисовывается.
2. Все равно - через 5 сек в главном окне появляется "(не отвечает)".

Вывод - Windows анализирует очередь главного (первого) потока. А не всех, которые принадлежат процессу.

Любопытно, хотя и странно. Какое дело Винде, какой там из потоков главный...


Чем больше думаю про эти ghost-окна, тем больше понимаю, что сделано в Windows все логично.
Будь у приложения 1000 потоков, Винда "ляжет" в цикле проверять их все.
Поэтому проверяет только очередь основного потока и порожденные им окна.

Видимо предполагается, что основной поток <=> главное окно.

Хотя Windows могли бы лучше это все задокументировать. ИМХО.
11 июл 19, 12:23    [21924765]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30502

11.07.2019 12:23, Dimitry Timokhov пишет:
> Видимо предполагается, что основной поток <=> главное окно.
> Хотя Windows могли бы лучше это все задокументировать. ИМХО.

GetWindowThreadProcessId(hWindow, @PID);
if IsMainWindow(hWindow) then ...

Posted via ActualForum NNTP Server 1.5

11 июл 19, 12:33    [21924786]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5215
Василий 2
Dimitry Timokhov
kealon(Ruslan),
Василий 2,

В общем проверил:
1. Создал окно на WinAPI (выбрал из другого своего проекта). Оно живое, обрабатывает очередь. Даже перерисовывается.
2. Все равно - через 5 сек в главном окне появляется "(не отвечает)".

Вывод - Windows анализирует очередь главного (первого) потока. А не всех, которые принадлежат процессу.

Любопытно, хотя и странно. Какое дело Винде, какой там из потоков главный...
тогда скорее всего проверяются все главные окна
через SendMessageTimeOut, это логично бы было
11 июл 19, 12:49    [21924805]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
kealon(Ruslan)
Василий 2
пропущено...

Любопытно, хотя и странно. Какое дело Винде, какой там из потоков главный...
тогда скорее всего проверяются все главные окна
через SendMessageTimeOut, это логично бы было


Вот и я про то же - могли бы лучше описать. Я лично не нашел чего-то внятного. Только пояснения на форумах и минимум текста в описании MSDN по теме...

И шикарная фраза "[This function is not intended for general use. It may be altered or unavailable in subsequent versions of Windows.]" тут https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-ishungappwindow...

Видимо, думают, а не "сносить" ли такие приложения сразу в Windows 11+?)))

Хотя все это не важно - ghost в любом случае лучше, чем без него.
Т.е. если вызвать DisableProcessWindowsGhosting, то вообще все мрет. А с гостом хоть отрисовывается и показывает, что "(не отвечает)". Т.е. имитация жизни))) И дает надежду, что отомрет.
11 июл 19, 13:01    [21924822]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5215
Dimitry Timokhov,

странно, попытался завесить окно с помощью Sleep (кнопка Test), не выходит заморозка

Win10 Home

"New win" окно в новом потоке откроет, т.е. повесить можно любой из потоков, приложение закроется когда все окна будут закрыты

тынц
11 июл 19, 13:15    [21924838]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
kealon(Ruslan)
странно, попытался завесить окно с помощью Sleep (кнопка Test), не выходит заморозка


"Exe" это, конечно, круто)))
Но только после того, как пол литра хотя бы вместе выпьем))

Тыкал на шапку главной формы?
В ghost вообще *может* (видимо) не впадать, если запустил и ждешь. Но если тыкнешь на главную форму, то сразу впадет.
11 июл 19, 13:19    [21924845]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5215
Dimitry Timokhov,

нефига не впадает

PS: есть же виртуалки если боишься, но могу заверить что там ничего нет, это тестовое приложение для WinAPI.
11 июл 19, 13:22    [21924851]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
vavan
Member

Откуда: Казань
Сообщений: 3386
Dimitry Sibiryakov
придётся отдельно заботиться о том, чтобы
пользователь этим курсором не тыкал куда не надо. А мне лень. ShowModal отбивает
возможность "потыкать" автоматически
мне тоже лень сделать красиво, потому просто дизаблю главную форму, оставляя возможность потаскать окно сплэша-прогресса (даже не модальное) и ткнуть в нем кнопку отмены, при наведении мыши на к-ю часики меняются на обычный курсор
11 июл 19, 13:29    [21924859]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
kealon(Ruslan)
нефига не впадает

PS: есть же виртуалки если боишься, но могу заверить что там ничего нет, это тестовое приложение для WinAPI.


1. По виртуалки. Но на моем HP ProBook 450 G5, если в биосе включить виртуализацию, то он грузится по 40 минут. Видимо, глюк. Но я так и не собрался в сервис сносить... Сижу без виртуалки.

2. Ок. Этап поллитры для пропустим))
Посмотрел. Не претендую на исходники. Понимаю, что тестовое приложение с кучей ценных фишек))

3. Что делаю:
а. Запустил.
б. Нажал "Test"
в. Сразу кликнул на шапку - ноль реакции (потаскать тоже нельзя).
г. Подождал 5 сек и кликнул на шапке => "(не отвечает)", можно таскать.
Сделал аналог, только открыл несколько форм.
На каждой через 5 сек получаю "(не отвечает)".

Win 10 Pro 64-бита

Я немного запутался. Правильно понимаю, что ты хочешь сказать, что любое окно можно повесить?
Ну собсно, я вроде не отрицал. Я говорил, что если есть еще одно *живое* окно в еще одном потоке, то это не будет препятствовать главному окну впасть в "(не отвечает)". Т.е. проверил совет 21924358

Вывод - Windows проверяет очередь каждого потока и анализирует необходимость впадать в "(не отвечает)" для окно этого потока.

ЗЫ Кода не видел твоего. Может я что-то неверно понял.
11 июл 19, 13:43    [21924883]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5215
Dimitry Timokhov,

да ничего особенного

+
procedure TWin.WMCommand(var msg: TWMCommand);
var s:WinString;
begin
  ...
  if Button1.isThisCtrl(msg.Ctl) then begin
    Sleep(30* 1000);
  ...
  if Button2.isThisCtrl(msg.Ctl) then begin
    TMyThread.Create(false);
  ...
end;

  TMyThread = class (TThread)
   protected
    procedure Execute; override;
  end;

procedure TMyThread.Execute;
begin
  CD.CreateWin(0,0,0,420,470,'Hello world');
//  TWin.Create(0,0,0,420,470,'Hello world');
  AppRun;

  FreeOnTerminate:=true;
end;


только оказывается и первое окно не в главном потоке :-(

begin
  CD:=TWin.RegisterAs;

  TMyThread.Create(false);

  repeat
    Sleep(1000);
  until WinCount=0;
end.         

а в главном консоль выходит

ладно, нету времени тест дорабатывать, завтра попробую потестить
11 июл 19, 13:53    [21924904]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
kealon(Ruslan)
ладно, нету времени тест дорабатывать, завтра попробую потестить

Тут скорее интерес теоретический.
Ибо, похоже, все же надо писать программы так, чтобы не было "(не отвечает)".
А то введет Windows вообще репрессии в будущем - десктопные приложения не имеют права засыпать больше, чем на 5 секунд. Не зря MSDN так скупо тему описывает.
11 июл 19, 13:58    [21924909]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Василий 2
Member

Откуда:
Сообщений: 757
Мимопроходящий
GetWindowThreadProcessId(hWindow, @PID);
if IsMainWindow(hWindow) then ...


Это вот эта шняга с SO имеется в виду?
BOOL IsMainWindow(HWND handle)
{
   return GetWindow(handle, GW_OWNER) == (HWND)0 && IsWindowVisible(handle);
}
11 июл 19, 14:03    [21924913]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Василий 2
Member

Откуда:
Сообщений: 757
В общем, получается, что безопаснее всего вызывать долгие операции в фоне, а в главном потоке показывать модальный прогресс-бар, блокируя главную форму (если эти операции не рассчитаны на отправку в фон).
11 июл 19, 14:11    [21924920]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 58951
Блог
Василий 2
В общем, получается, что безопаснее всего вызывать долгие операции в фоне, а в главном потоке показывать модальный прогресс-бар, блокируя главную форму (если эти операции не рассчитаны на отправку в фон).

Модальности можно избежать, если делать интерфейс на action-ах. Тут можно вспомнить недавний разговор про статусбары :) В наиболее полном виде я сделал такую систему в одном из проектов, там было так:

- действие по умолчанию блокировало все прочие (action-ы дисейблились)
- действие могло быть прерываемым (в статусбар выводилась кнопка break)
- действие могло сообщать информацию о прогрессе (в статусбар выводился прогрессбар)
- действие могло сообщать название выполняемой стадии (выводилось либо в статусбар, либо в отдельном псевдомодальном окне в зависимости от важности операции.

В качестве бонуса - пока выполнялось это действие, можно было скроллировать карту в главном окне, менять масштаб и делать прочие безобидные вещи.
11 июл 19, 14:51    [21924959]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
rgreat
Member

Откуда:
Сообщений: 5399
Пользуюсь DisableProcessWindowsGhosting и все ок.
11 июл 19, 14:52    [21924963]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
Василий 2
В общем, получается, что безопаснее всего вызывать долгие операции в фоне, а в главном потоке показывать модальный прогресс-бар, блокируя главную форму (если эти операции не рассчитаны на отправку в фон).


Походу, именно так.

Другой вопрос, что просто оправить свои алгоритмы (без обращения к БД) в фон - это легко.
Другой вопрос, что в фон надо отправить обращение к БД.
А вот тут вопрос, как делать.

Я, вот, ADODB пользуюсь. Насколько я понимаю, там потоковая модель Both. Но работаю с ней как STA (сама дельфа вызывает за меня CoInitialize) Т.е. если мелочь миллисекундная по обращению к БД идет из главного потока, а отчеты надо делать из доп. потока... то не понятно, как обращаться к ADODB - нельзя же из разных потоков.

Или можно? Сколько ни пытаюсь эти STA/MTA понять, все никак...
11 июл 19, 15:09    [21924987]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
rgreat
Пользуюсь DisableProcessWindowsGhosting и все ок.

У меня пользователи сами распараллеливают свою работу: 2-3 клиента запускают.
В одном вводят, в другом - отчеты считают.
После вызова DisableProcessWindowsGhosting приложение наглухо гаснет - ни мышкой не достанешь, ни ALT+TAB... Будет паника - все повисло, караул!!!
11 июл 19, 15:11    [21924989]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
rgreat
Member

Откуда:
Сообщений: 5399
Dimitry Timokhov,

Там гже пользуюсь у меня приложение гарантированно одно. Через мютекс.
11 июл 19, 15:27    [21925006]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
rgreat
Member

Откуда:
Сообщений: 5399
Ну и "Пожалуйста подождите." всегда надо в нужных моментах пользователю писать.
11 июл 19, 15:28    [21925007]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
rgreat
Member

Откуда:
Сообщений: 5399
С обственно это ленивое решение проблемы, которую по хорошему надо решать выносом кода в отдельные от GUI потоки.
11 июл 19, 15:30    [21925009]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
rgreat
Там гже пользуюсь у меня приложение гарантированно одно. Через мютекс.

ну все равно имхо не айс:
1. запустил приложение твой пользователь
2. при запуске ты вызвал DisableProcessWindowsGhosting
3. пользователь запустил отчет.
4. пошел почту проверить в браузере.
5. а в приложение не вернешься уже...пока отчет не выполнится до конца.
полное ощущение "зависа"...
11 июл 19, 15:30    [21925011]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
rgreat
Member

Откуда:
Сообщений: 5399
Dimitry Timokhov
3. пользователь запустил отчет.
4. пошел почту проверить в браузере.
5. а в приложение не вернешься уже...пока отчет не выполнится до конца.
полное ощущение "зависа"...

Если пользователя заранее предупредить что мол "ждите" - ничего страшного не будет.
И уж точно это лучше чем если пользователь "случайно" закроет работающую Ghost форму.
11 июл 19, 15:32    [21925014]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
rgreat
Member

Откуда:
Сообщений: 5399
И не забываем и о других глюках которые возможны если юзер будет всячески кликать и таскать Ghost формы.
11 июл 19, 15:37    [21925019]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
vavan
Member

Откуда: Казань
Сообщений: 3386
Dimitry Timokhov
в фон надо отправить обращение к БД.
А вот тут вопрос, как делать
как вариант писать свои обертки к-е прозрачно перенесут все обращения к бд в поток, само клиентское приложение в местах открытия датасетов трогать не придется
11 июл 19, 15:39    [21925022]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5215
Dimitry Timokhov
Василий 2
В общем, получается, что безопаснее всего вызывать долгие операции в фоне, а в главном потоке показывать модальный прогресс-бар, блокируя главную форму (если эти операции не рассчитаны на отправку в фон).


Походу, именно так.

Другой вопрос, что просто оправить свои алгоритмы (без обращения к БД) в фон - это легко.
Другой вопрос, что в фон надо отправить обращение к БД.
А вот тут вопрос, как делать.

Я, вот, ADODB пользуюсь. Насколько я понимаю, там потоковая модель Both. Но работаю с ней как STA (сама дельфа вызывает за меня CoInitialize) Т.е. если мелочь миллисекундная по обращению к БД идет из главного потока, а отчеты надо делать из доп. потока... то не понятно, как обращаться к ADODB - нельзя же из разных потоков.

Или можно? Сколько ни пытаюсь эти STA/MTA понять, все никак...
COINIT_MULTITHREADED = 0; // OLE calls objects on any thread.

но там скорее всего на гуи обвязка от VCL, либо напрямую с интерфейсами работать либо очень осторожно в обход расставленных граблей, и так швах и так швах выходит
11 июл 19, 15:41    [21925027]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
kealon(Ruslan)
но там скорее всего на гуи обвязка от VCL, либо напрямую с интерфейсами работать либо очень осторожно в обход расставленных граблей, и так швах и так швах выходит


у меня от VCL используется только совсем база, без которой нельзя. Никакими датабазными компонентами не пользуюсь. Грид свой. ADODB импортировал сам лет 20 назад, периодически переимпортирую. Т.е. ADODB в моих руках. Курсорами не пользуюсь. Через ADODB.Recordset забираю все, что нужно, через ADODB.Command путем вызова сохр. процедур возвращаю, что поменял.

Вывод - к интерфейсам ADODB имею прямой доступ.

Вообще, всегда был уверен, что ADODB имеет потоковую модель STA. Посмотрел в реестре- BOTH!! Т.е. и в MTA тоже, по идее, могёт.

kealon(Ruslan)
COINIT_MULTITHREADED = 0; // OLE calls objects on any thread.

Но это, насколько понимаю, надо само мое приложение в таком режиме запустить и все потоки тоже, чтобы они попали в один MTA.
Если с потоками понятно - CoInitializeEx(COINIT_MULTITHREADED) - то, что делать с главным потоком, чтобы он тоже попал в MTA? Нашел ComObj.CoInitFlags - оно?

Надо попробовать, но здорово было знать, что оно получится)))

Может есть у кого опыт использования ADODB в режиме MTA?
11 июл 19, 15:55    [21925043]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5215
Dimitry Timokhov
kealon(Ruslan)
COINIT_MULTITHREADED = 0; // OLE calls objects on any thread.

Но это, насколько понимаю, надо само мое приложение в таком режиме запустить и все потоки тоже, чтобы они попали в один MTA.
Если с потоками понятно - CoInitializeEx(COINIT_MULTITHREADED) - то, что делать с главным потоком, чтобы он тоже попал в MTA? Нашел ComObj.CoInitFlags - оно?
каждый поток создающий объекты, которые могут использоваться в других потоках должен вызывать CoInitializeEx(COINIT_MULTITHREADED)
вложенный запуск тоже поддерживается, т.е. достаточно например при старте формы
11 июл 19, 16:02    [21925053]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
vavan
Member

Откуда: Казань
Сообщений: 3386
Dimitry Timokhov
что делать с главным потоком, чтобы он тоже попал в MTA?
это иногда путь к потенциальным траблам к сожалению
11 июл 19, 16:11    [21925063]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
vavan
Member

Откуда: Казань
Сообщений: 3386
Dimitry Timokhov
у меня от VCL используется только совсем база, без которой нельзя. Никакими датабазными компонентами не пользуюсь
подход в любом случае можно сохранить аналогичный, инициируя в месте "открытия"/загрузки ожидание завершения фактического обращения к бд в другом потоке, с прокруткой/обработкой цикла виндовых сообщений
11 июл 19, 16:14    [21925064]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
vavan
подход в любом случае можно сохранить аналогичный, инициируя в месте "открытия"/загрузки ожидание завершения фактического обращения к бд в другом потоке, с прокруткой/обработкой цикла виндовых сообщений

Ну о том, что так нельзя, весь топик, начиная с моего тут появления))
Если в другом потоке обрабатывать очередь (свою очередь - PeekMessage не может же обрабатывать очередь чужого потока!), то это не спасет первый поток и главную форму от впадения в ghost-режим. Вот 21924390 и вот 21924838.

Выход один - долгий запрос выводить в отдельный безоконный поток. А в главном крутить (обрабатывая очередь) прогресс или просто вывешивать форму.
Ну и как-то научиться юзать AdoDb.Connection из этого отдельного потока, тогда как сам объект AdoDb.Connection был создан в главном потоке.
Пойду про MTA почитаю:) Вот статья есть [url=]https://rsdn.org/?article/com/apartmnt.xml[/url]
11 июл 19, 16:54    [21925094]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
vavan
Member

Откуда: Казань
Сообщений: 3386
Dimitry Timokhov
о том, что так нельзя, весь топик, начиная с моего тут появления))
Если в другом потоке обрабатывать очередь
а я толкую про обработку в основном
11 июл 19, 17:31    [21925127]     Ответить | Цитировать Сообщить модератору
 Re: Параметр реестра HungAppTimeout  [new]
Василий 2
Member

Откуда:
Сообщений: 757
Dimitry Timokhov
Ну и как-то научиться юзать AdoDb.Connection из этого отдельного потока, тогда как сам объект AdoDb.Connection был создан в главном потоке.

Если там унутрях никаких своих ProcessMessages нету, то в принципе при условии полной блокировки обращения к БД со стороны главного потока не должно быть проблем при использовании connection из фонового потока
11 июл 19, 20:03    [21925237]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3 4      [все]
Все форумы / Delphi Ответить