Прерывание в службе Win. аналог Application.ProcessMessages

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Прерывание в службе Win. аналог Application.ProcessMessages

Сообщение jsa » 25.08.2023 15:01:53

Здравствуйте.
В оконном приложении с прерыванием в долгом цикле тяжелых вычислений все понятно, можно поставить Application.ProcessMessages и цикл и интерфейс не виснет.
А как быть в службе? Написал службу которая раз в указанный период делает выборку новых данных и обрабатывает. И иногда очередной блок бывает не маленьким. Можно конечно брать небольшими блоками. Но все таки хочется знать как сделать так чтобы службу можно было в произвольный момент поставить на паузу и или выключить штатными средствами и чтобы не выскакивало сообщение о том, что она не отзывается.
jsa
постоялец
 
Сообщения: 282
Зарегистрирован: 28.11.2017 13:46:04

Re: Прерывание в службе Win. аналог Application.ProcessMessa

Сообщение wavebvg » 26.08.2023 10:56:50

Поток управления службой не должен заниматься вычислениями.
wavebvg
постоялец
 
Сообщения: 354
Зарегистрирован: 28.02.2008 04:57:35

Re: Прерывание в службе Win. аналог Application.ProcessMessa

Сообщение Alex2013 » 01.09.2023 21:24:14

Я тут такой "велосипед" проверил :
Код: Выделить всё
procedure TForm1.TimeSleep ;
Var
   StartTime:QWord;
begin
  StartTime:=GetTickCount64;
  While  GetTickCount64-StartTime<5000 do
  begin
   Application.ProcessMessages;
  end;
  mainform.panel7.Caption:='  Терминал';
end;
...
procedure TForm1.Timer3Timer(Sender: TObject);
begin
...
// Типа "отложенная задержка" не тормозящая исполнение  программы.
// Что для обработчика таймера очень критично .
  TThread.Queue (nil, TimeSleep );
...
end;

Зы
Почти квантовая механика с ее знаменитым "отложенным выбором ". :wink: :idea:
Application.ProcessMessages; можно было не вызвать а поставить Sleep (100) но я не решился ( как я понял TThread.Queue () "вырывает" исполнение TimeSleep из основного потока программы но черт его знает в каком контексте он выполняется . Не хватало еще ядро оси повесить ) . А так вроде работает и не тормозит таймер.

Особый прикол несколько вызовов TThread.Queue подряд (По идее поток программы "проскочит дальше", а коды в вызываемых процедурах "станут в очередь" вроде возможно "параллельное исполнение" однако реально новый поток не создается, а просто используется некий "другой" ( возможно родительский например проводника ) )
Alex2013
долгожитель
 
Сообщения: 3048
Зарегистрирован: 03.04.2013 11:59:44

Re: Прерывание в службе Win. аналог Application.ProcessMessa

Сообщение Alex2013 » 08.09.2023 17:56:32

В догонку !
Погонял TThread.Queue более "вдумчиво" увы не все така гладко как мне бы хотелось ( Вроде работает однако задержка "через раз" срабатывает не так как мне нужно )
Alex2013
долгожитель
 
Сообщения: 3048
Зарегистрирован: 03.04.2013 11:59:44


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16

Рейтинг@Mail.ru