powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / пустой Service кушает до 15% ресурсов CPU
25 сообщений из 166, страница 3 из 7
пустой Service кушает до 15% ресурсов CPU
    #40053532
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
какие хэндлы передавать в MsgWaitForMultipleObjects (которых нет) при каждой итерации в нормальном режиме работы?)

Похоже азы при работе с потоками где-то были пропущены и попытка подвести к пониманию этого вывода вызывает отторжение.
Твой подход - в корне неверен, но виноват в этом на самом деле delphi, т.к. они сделали кривую обертку над сервисом, которая позволяет так делать. Но эта обертка позволяет сделать и чуть лучше.

В данном случае в MsgWaitForMultipleObjects должен передаваться хэндл события - TEvent в дельфи. Им можно управлять (выставлять и сбрасывать) из любого потока. Их так же можно сделать несколько и дергать любой из них. Один - для работы, другой - для завершения потока и т.п.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053539
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57
asutp2
Соответственно, а какие хэндлы передавать в MsgWaitForMultipleObjects
Да, собственно, любые хэндлы, которые сигнализируют твоему сервису, что нужно проснуться и выполнить работу, а не дёргаться постоянно в sleep'ах
это всё общие слова, давай конкретику - какой конкретно хендл должен уведомить о пробуждении TServiceThread. А то ведь я "нахватался умных слов, а что делать с этим, не знаю" (c)
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053540
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему-то вспомнилосьПостовой (останавливает машину): Сержант Петров! Прошу документы!
Водитель: Добрый день!
Постовой: Документы ваши! Права!
Водитель: И не говорите. Очень жарко.
Постовой: Права!
Водитель: А?
Постовой: Вы плохо слышате?
Водитель: Гововите громче.
Постовой (орет): Вы нарушили правила! Ваши права!
Водитель: Вы правы, очень жарко. Я весь мокрый. А вы?
Постовой: Вы что, глухой? Какой знак висит? Знак висит какой?
Водитель: Где?
постовой: Вон, наверху!
Водитель: Я вижу, я не глухой!
Постовой: Красное с желтым наверху для чего повешено?
Водитель: Кстати, там что-то висит, надо снять - отвлекает.
постовой: Посередине на желтом фоне, что чернеет такое красное?
Водитель: Громче, очень жарко!
Постовой: Вы глухой?
Водитель: Я плохо вижу.
Постовой: Глухой, да еще и слепой, что ли?
Водитель: Не слышу!
Постовой: Как же вы за руль сели?
Водитель: Спасибо, я не курю. Да вы не волнуйтесь. Вон в машине двое.
Один видит, другой слышит! А я рулю.
Постовой: Черная стрелка направо зачеркнута. Это что значит? Не слышу.
Водитель: Вы что, глухой? Зачеркнута? Наверное, поставили, потом
зачеркнули.
Постовой: Вы в своем уме? Это значит, направо поворачивать нельзя.
Водитель: Кто вам сказал?
Постовой: Я что, по-вашему, идиот?
Водитель: Вы много на себя берете. Куда я, по-вашему, повернул?
Постовой: Повернули направо.
Водитель: Да вы что? Я повернул налево. Вы просто не тем боком стоите.
Постовой: Господи! Где у вас лево?
Водитель: Вот у меня лево. Вот левая рука, вот правая. А у вас?
Постовой: Эта рука никогда не была левой.
Водитель: Не говорите глупостей! Это надо знать. Вот левая! Вот правая!
Неужели вы этого не проходили? А еще регулировщик! Просто вы
не тем боком стоите.
Постовой: Тьфу! Хорошо, вон идет прохожий, спросим у него. У нас еще не
все идиоты. Товарищ! Ответьте: какая рука левая, какая правая?
Прохожий: Первый раз слышу!
Постовой: Не иначе в сумасшедшем доме день открытых дверей. Какая ваша
левая рука, какая правая?
Прохожий: Лично у меня эта рука левая, а это правая. Или с сегодняшнего
дня переименовали?
Водитель: А вы не верили, товарищ сержант. Видите, у нас руки совпадают,
а у вас перепутаны.
Постовой (недоуменно разглядывает свои руки): Ничего не понимаю!
Прохожий: Я могу идти?
Постовой: Идите, идите.
Прохожий: Куда?
Постовой: Идите прямо, никуда не сворачивая, и уйдите отсюда подальше!
Прохожий: Спасибо, что подсказали. А то я два часа иду, не могу понять,
куда! (Уходит)
Водитель: Вам что-то нужно делать с руками. Я никому не скажу, но при
вашей работе могут быть неприятности.
Постовой: И я про вас никому. Езжайте! Да, когда свернете налево, ну
вы-то направо, там проезд запрещен, обрыв. Но вам туда можно!!!

(c) Семен Альтов
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053541
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
asutp2
какие хэндлы передавать в MsgWaitForMultipleObjects (которых нет) при каждой итерации в нормальном режиме работы?)

Похоже азы при работе с потоками где-то были пропущены и попытка подвести к пониманию этого вывода вызывает отторжение.
Твой подход - в корне неверен, но виноват в этом на самом деле delphi, т.к. они сделали кривую обертку над сервисом, которая позволяет так делать. Но эта обертка позволяет сделать и чуть лучше.

В данном случае в MsgWaitForMultipleObjects должен передаваться хэндл события - TEvent в дельфи. Им можно управлять (выставлять и сбрасывать) из любого потока. Их так же можно сделать несколько и дергать любой из них. Один - для работы, другой - для завершения потока и т.п.
Скажи мне дружище, а зачем мне вообще повторять код обертки, если всё сведется к тому же самому? TService и TServiceThread со своей задачей справляются, поэтому не вижу вообще никакой необходимости писать аналогичный код.

И чем дальше, тем более понятно, что большинство из присутствующих не понимают о чем вообще идет речь.
Мы что, обсуждаем работу порождаемых потоков, реализующих какой то полезный функционал? Нет. Речь идет о TServiceThread и о его методе Execute, о его загрузке процессора. Рекомендую для начала почитать стековерфлоу, изучить исходники в самой делфи, статистику и примеры применения sleep в потоках. А уже потом нести ахинению.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053542
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
А уже потом нести ахинению.

Понятно.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053546
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
asutp2
А уже потом нести ахинению.

Понятно.
Сливаешься? А я думал, ты мне расскажешь о возможных TEvent у сервиса, которые "не любые", а конкретные и известные, ведь мы, еще раз напомню, говорим о сервисе Windows
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053568
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2,

сервис ведь что-то делает? Принимает запросы по сети или еще что-то. Ну вот эти события, которых он ожидает, могут порождать события, events. Это так - из общих соображений, сервисы не писал. Но прием данных по сети, когда поток ждет, а приход данных в буфер сокета активирует событие, и для ожидания используется функция WaitForMultipleObjects, такое было.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053577
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2А я думал, ты мне расскажешь о возможных TEvent у сервиса, которые "не любые", а
конкретные и известные, ведь мы, еще раз напомню, говорим о сервисе Windows

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Procedure Service.OnStart()
begin
   StopEvent := CreateEvent(.....);
end;

Procedure Service.OnExecute()
begin
  ....
  WaitForSingleObject(StopEvent, INFINITE);
end;

Procedure ServiceOnStop()
begin
   SetEvent(StopEvent);
end;


Но и это дублирует код в самом менеджере сервисов. Поток с OnExecute - не нужен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053606
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
Рекомендую для начала почитать стековерфлоу, изучить исходники в самой делфи, статистику и примеры применения sleep в потоках.
И что говорит статистика? Ты правда не понимаешь, чем опасен sleep?
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053610
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
wadman
пропущено...

Понятно.
Сливаешься? А я думал, ты мне расскажешь о возможных TEvent у сервиса, которые "не любые", а конкретные и известные, ведь мы, еще раз напомню, говорим о сервисе Windows

Нужно понимать, что люди тут отвечают исключительно из альтруистических соображений и не все готовы бесконечно поддерживать тупиковую ситуацию на плаву.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053624
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно понимать, что когда речь заходит об омонимах (Windows Event и Delphi Event в данном
случае), люди начинают тупить и стоять на своём.

PS: А ещё свою лепту вносят event-ы, приходящие в https://docs.microsoft.com/en-us/windows/win32/api/winsvc/nc-winsvc-lphandler_function_ex
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053632
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
а зачем мне вообще повторять код обертки, если всё сведется к тому же самому? TService и TServiceThread со своей задачей справляются, поэтому не вижу вообще никакой необходимости писать аналогичный код
Постараюсь объяснить (один раз), почему я не использую ServiceExecute.
Казалось бы, для однопоточных сервисов можно было бы использовать поток ServiceExecute, чтобы не порождать свой. Но у меня таких (однопоточных) не бывает, у меня минимум два потока (даже в тестовых сервисах) - логгер и рабочий поток. А обычно - логгер, обновлятор, и несколько рабочих потоков, которые занимаются своими делами.
И вот такая архитектура: при старте я эти потоки в нужном порядке запускаю, при стопе - в нужном порядке убиваю.
А использование ServiceExecute ломает эту прозрачную архитектуру, как минимум.

Потому, отвечать на вопрос, как обойтись в ServiceExecute без Sleep - даже не хочется. Но, понятное дело, что обойтись можно и нужно с помощью Wait-функций, если уж используешь этот поток.

Ну и последнее. Ты там приводил "заплюсованный код" со слипом со стэковерфло. Этот код - убожество, я его даже цитировать не хочу. Плюсовали его либо в шутку, либо нубы.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053636
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockИ вот такая архитектура: при старте я эти потоки в нужном порядке запускаю, при стопе - в
нужном порядке убиваю.
А использование ServiceExecute ломает эту прозрачную архитектуру, как минимум.

"Чо?"

Что там у тебя сломается если в начале кода ServiceExecute ты создашь все нужные
дополнительные потоки, а в конце из убьёшь?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053639
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
YuRockИ вот такая архитектура: при старте я эти потоки в нужном порядке запускаю, при стопе - в
нужном порядке убиваю.
А использование ServiceExecute ломает эту прозрачную архитектуру, как минимум.

"Чо?"

Что там у тебя сломается если в начале кода ServiceExecute ты создашь все нужные
дополнительные потоки, а в конце из убьёшь?Ничего не изменится, кроме ввода дополнительного хвента и его ожидания. В том-то и дело. Лишняя писанина и меньшая наглядность.
И так и так нужны Start и Stop, так зачем же еще событие.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053644
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
_Vasilisk_
Уже неоднократно говорили: про ServiceExecute забыть вообще. В ServiceStart запускать свой поток, в ServiceStop его останавливать
Аргументация данного подхода? Пруфы на стековерфлоу, эмбу? Лично я не вижу необходимости повторять реализацию TServiceThread, он прекрасно справляется со своей задачей


Сервис в фоне выполняет задачи.
Эти задачи могут быть выполнены одним, двумя, восемью и т.д. потоками... Это неважно сколько их будет.. Важно что сервис в определенное время или по определенным событиям выполняет задачи..
И важно чтобы задачи не ждали друг друга, а были конкурентными (и как частный случай - параллельными)
Стандартный Execute для этой цели не подходит... Вот и все..
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053649
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteСтандартный Execute для этой цели не подходит... Вот и все..

Ну ёёёё...

TService вызывает последовательно OnStart и OnExecute. Ты в самом деле видишь большую
разницу в создании дополнительных потоков на одну строчку кода выше?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053650
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спорите о том чей фломастер вкуснее... разница не велика, просто используя стандартный Execute надо придерживаться его стандартов (заглянуть в исходники), не забывать вызывать ProcessRequests(false)?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure TMyService.ServiceExecute(Sender: TService);
begin
  OleCheck(CoInitialize(nil));
  try
    ReadConfig;
    while NOT Terminated do
    begin
      ServiceThread.ProcessRequests(False);
      Process;
      Sleep(100); // для ленивых
    end;
  finally
    CoUninitialize;
  end;
end;


или
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure TMyThread.Execute;
begin
  OleCheck(CoInitialize(nil));
  try
    ReadConfig;
    while NOT Terminated do
    begin
      Process;
      Sleep(100); // для ленивых
    end;
  finally
    CoUninitialize;
  end;
end;



ну и поток пуск стоп не забыть...
вся разница!
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053667
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А давайте поговорим о использовании ресурсов процессора)) Почему sleep(100)? Почему не 1,10,1000,10000....? Откуда эта цифра взялась?
Давайте посмотрим на переключения контекста в счетчиках производительности.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053670
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zeliusпросто используя стандартный Execute надо придерживаться его стандартов (заглянуть в
исходники), не забывать вызывать ProcessRequests(false)?

А зачем вообще его вызывать? Только потому, что так написано индусами в
совершенно тупом примере кода?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053674
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Zeliusпросто используя стандартный Execute надо придерживаться его стандартов (заглянуть в
исходники), не забывать вызывать ProcessRequests(false)?

А зачем вообще его вызывать? Только потому, что так написано индусами в
совершенно тупом примере кода?..
По большому счету только для SERVICE_CONTROL_INTERROGATE
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053675
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

потому что это как ProcessMessages для VCL, все сообщения сервису поступают через него (пуск, стоп, пауза... см. TServiceThread.ProcessRequests).
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053678
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Чо?"

В самой винде они поступают прямо в вышеназванный callback из отдельного потока, а
дельфиские приложения вдруг требуют плясок с вызовом какой-то левой хрени?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053679
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius
Dimitry Sibiryakov,

потому что это как ProcessMessages для VCL, все сообщения сервису поступают через него (пуск, стоп, пауза... см. TServiceThread.ProcessRequests).
ServiceExecute - это просто событие-коллбэк. Без его описания и тем более "вызова" - сообщения типа "старт/стоп/пауза" отлично приходят.
Приходят через указанный при инициализации службы коллбэк.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053688
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
ServiceExecute - это просто событие-коллбэк. Без его описания и тем более "вызова" - сообщения типа "старт/стоп/пауза" отлично приходят.
Приходят через указанный при инициализации службы коллбэк.

А разве, если не назначить OnExecute, сервис не завершится сам сразу после запуска?..
Ну примерно как обычный TThread, если у него не перекрыть Execute().
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053691
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

нет, тогда он вызовет ProcessRequest(True) и там цикл пока не Terminated
...
Рейтинг: 0 / 0
25 сообщений из 166, страница 3 из 7
Форумы / Delphi [игнор отключен] [закрыт для гостей] / пустой Service кушает до 15% ресурсов CPU
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]