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

Откуда: Нижневартовск
Сообщений: 4805
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

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

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

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

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

Откуда: Нижневартовск
Сообщений: 4805
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

Откуда:
Сообщений: 607
Мимопроходящий
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

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

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

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

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

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

Откуда:
Сообщений: 5070
Пользуюсь 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

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

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

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

Откуда:
Сообщений: 5070
С обственно это ленивое решение проблемы, которую по хорошему надо решать выносом кода в отдельные от 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

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

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

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

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

Откуда: Нижневартовск
Сообщений: 4805
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

Откуда: Нижневартовск
Сообщений: 4805
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

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

Откуда: Казань
Сообщений: 3308
Dimitry Timokhov
у меня от VCL используется только совсем база, без которой нельзя. Никакими датабазными компонентами не пользуюсь
подход в любом случае можно сохранить аналогичный, инициируя в месте "открытия"/загрузки ожидание завершения фактического обращения к бд в другом потоке, с прокруткой/обработкой цикла виндовых сообщений
11 июл 19, 16:14    [21925064]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
Все форумы / Delphi Ответить