powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / пустой Service кушает до 15% ресурсов CPU
166 сообщений из 166, показаны все 7 страниц
пустой Service кушает до 15% ресурсов CPU
    #40053303
yemets63
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему нагрузка на CPU 10 - 15%.
показываю пустой Service, он работает, и он как полный с моим функционалом, так и пустой кушат 10-15% CPU, и максимально потребляет энергию по GPU и CPU.
я может не знаю, может какие то ключи надо поставить
антивирусником все прогнал, службу в исключения внес, служба запускается, могу остановить, перезапустить. к функционалу службы вопросов нет.

вот текст:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  ServiceApplication.Controller(CtrlCode);
end;

function TServiceApplication.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TServiceApplication.ServiceExecute(Sender: TService);
begin
  while terminated = false do
  begin
    ServiceThread.ProcessRequests(false);
  end;
end;

procedure TServiceApplication.ServiceStart(Sender: TService;
  var Started: Boolean);
begin
  Started := true;
end;

procedure TServiceApplication.ServiceStop(Sender: TService;
  var Stopped: Boolean);
begin
  Stopped := true;
end;
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053305
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ведь тебя предупреждали не пользоваться ProcessMessages и компанией...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053306
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yemets63,

добавь Sleep(100) после ProcessRequests
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053307
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yemets63,

так это, цикл
Код: pascal
1.
2.
3.
4.
  while terminated = false do
  begin
    ServiceThread.ProcessRequests(false);
  end;



шарашит без перерыва, и на 100% грузит одно ядро. Ничего удивительного. imho то же самое, что в бесконечном цикле зарядить
a:=a + 0;
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053308
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yemets63
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TServiceApplication.ServiceExecute(Sender: TService);
begin
  while terminated = false do
  begin
    ServiceThread.ProcessRequests(false);
  end;
end;



Что это за д. вечный цикл? Зачем вообще этот бред?
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053317
yemets63
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
цикл стоит для примера, к сожалению не могу показать полный текст функционала, хотя отдельно функционал не грузит проц вообще, а как вставляю в Execute так 14%. в нем нет зацикливаний.
сижу по шагам проверяю поведение функционала в Service.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053320
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yemets63
отдельно функционал не грузит проц вообще
Проц грузит постоянный вызов "функционала" в бесконечном цикле.
Просто while True do; будет грузить точно так же.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053321
yemets63
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
когда вырезал код, немного ошибся,

asutp2, спасибо за sleep

я даже убрал Timer который мне не особо был нужен, и вставил в цикл, чего не было, но вставил в пример,
в итоге, еле-еле службу нашел, 0% и работает очень даже классненько, раздает и получает, слышить и посылает, и всегда CPU=0%.

Код: plsql
1.
2.
3.
4.
5.
6.
  while not Terminated do 
  begin
    ... функционал
    ServiceThread.ProcessRequests(true); 
    sleep(100);
  end;
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053322
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yemets63
когда вырезал код, немного ошибся,

asutp2, спасибо за sleep

я даже убрал Timer который мне не особо был нужен, и вставил в цикл, чего не было, но вставил в пример,
в итоге, еле-еле службу нашел, 0% и работает очень даже классненько, раздает и получает, слышить и посылает, и всегда CPU=0%.

Код: plsql
1.
2.
3.
4.
5.
6.
  while not Terminated do 
  begin
    ... функционал
    ServiceThread.ProcessRequests(true); 
    sleep(100);
  end;

Вообще да, чем больше sleep-ов в коде - тем меньше процесс жрет процессор. Можно их еще превентивно расставлять между строками алгоритмов.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053324
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yemets63цикл стоит для примера,

А вставка Sleep() в несуществующий цикл помогла. Чудны дела твои...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053326
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock> Можно их еще превентивно расставлять между строками алгоритмов.


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053379
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Вообще да, чем больше sleep-ов в коде - тем меньше процесс жрет процессор. Можно их еще превентивно расставлять между строками алгоритмов.
Видимо ты забываешь, что речь идет о сервисе , центральным потоком, с точки зрения реализации в делфи, является ServiceExecute. Единократный вызов sleep в каждом шаге while это весьма сбалансированное решение, и оно также отлично работает и при реализации демонов для линуса.

А если считаешь, что использование Sleep() в связке ProcessRequests является неправильным решением для уменьшения нагрузки на проц внутри ServiceExecute, тогда расскажи свое, "правильное". Будет весьма интересно услышать, как в главном потоке без UI и минимальным внешним воздействием от ОС на сервис ты разруливаешь дележку проца)))))
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053383
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
YuRock
Вообще да, чем больше sleep-ов в коде - тем меньше процесс жрет процессор. Можно их еще превентивно расставлять между строками алгоритмов.
Видимо ты забываешь, что речь идет о сервисе , центральным потоком, с точки зрения реализации в делфи, является ServiceExecute. Единократный вызов sleep в каждом шаге while это весьма сбалансированное решение, и оно также отлично работает и при реализации демонов для линуса.

А если считаешь, что использование Sleep() в связке ProcessRequests является неправильным решением для уменьшения нагрузки на проц внутри ServiceExecute, тогда расскажи свое, "правильное". Будет весьма интересно услышать, как в главном потоке без UI и минимальным внешним воздействием от ОС на сервис ты разруливаешь дележку проца)))))


1. Я никогда не использую ServiceExecute. В ServiceStart я запускаю свой поток, в ServiceStop - убиваю его.
2. Что такое ProcessRequests - я вообще не знаю, да и знать не хочу.
Ну это всё мои предпочтения. Не претендую на единственно правильные решения.

Вот самое главное.
Любой поток должен либо выполнять задачу, либо ждать сигнала, после которого либо завершаться, либо начинать выполнять очередную задачу. Для Sleep тут места нет.
Sleep допустимо применять в 3 случаях:
- Для осознанной передачи управления другому потоку (бывает такая необходимость) - Sleep( 0 );
- Для тестовых программ;
- Для программ типа такой:

Код: pascal
1.
2.
3.
4.
5.
6.
program pause;
uses Windows, SysUtils;
begin
  if ParamCount > 0 then
    Sleep( StrToIntDef( ParamStr( 1 ), 0 ) * 1000 );
end.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053404
yemets63
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и так в продолжении, теперь уже SLEEP
SLEEP- кстати чудная штука,
в моем SERVICE я попробовал 2 решения, свои потоки и ServiceExecute с использованием sleep,
мне всё одинаково, но ServiceExecute нравится больше.

и так о SLEEP, почему это чудная, парадоксальная и полезная штука.
году в 2004, тогда первые проекты огромные были, и я очень любил и люблю трехзвенку, и тогда уже года 4 был на DEVART, не помню как они тогда назывались, начал внедрять рабочую систему в Воркуте и на севере. Разработка нашей команды и уже пару лет проработавшая в центральном регионе России. Проблем до Воркуты не было.
Но там, на севере было что то, не то спутники советские, не то интернет за счет динамомашин, а трехзвенка любит постоянный коннект. скорость низкая и постоянные паузы. что делать? Проверять обрыв коннекта, сздавать и восстанавливать транзакции, или делать пакеты для локальной работы потом их гонять и сохранять, или искать другие решения...?
В итоге поехал я на север решать проблемы, Мирный, Архангельск, и т.д., да еще и зимой, и когда стал совсем замерзать, решил попробовать между вызовом метода сервера и использованием ClientDataSet вставлять sleep и всё это завернул в потоки. Так вот, при 256 Кбит с нестабильной связью это все ЗАработало. значением Sleep можно было управлять.
До 2011 года работа приложений-клиентов с серверов-прилоений была безупречно, ну и функционал тоже, потом потеряли контакт с заказчиком, смена хозяина, другие правила бизнеса, "грёбанные" торги...

так что sleep полезная вещь!
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053408
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
yemets63
а трехзвенка любит постоянный коннект

Тут некоторые люди переходят на "трехзвенку" из-за того, что не нужен постоянный коннект...
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053409
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yemets63
когда стал совсем замерзать, решил попробовать между вызовом метода сервера и использованием ClientDataSet вставлять sleep и всё это завернул в потоки. Так вот, при 256 Кбит с нестабильной связью это все ЗАработало. значением Sleep можно было управлять.
Я и говорю - использование Sleep как можно чаще - снижает нагрузку на железо, а сэкономленную таким образом электроэнергию можно использовать для обогрева окружающей среды, чтоб не замерзать.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053410
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock1. Я никогда не использую ServiceExecute. В ServiceStart я запускаю свой поток, в ServiceStop - убиваю его.
воистину!
Кстати, я нашел аналогичное обсуждение, 5-летней давности, там такому же автору настучали канделябром.
https://stackoverflow.com/questions/33625164/service-application-in-delphi

Собственно, мораль такая, что если в ServiceExecute вызывать такой цикл, то никакой TThread не нужен. А надо наоборот - ServiceExecute не вызывать, и всё делать в TThread.Execute. Там тоже можно сделать бесконечный цикл с загрузкой 1 ядра на 100%, но это уже другой вопрос.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053411
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настало время охуительных историй.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053413
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

да по первому сообщению возникло впечатление, что автор вопроса не знает, что у него 6-ядерный проц, и как эти ядра загружаются.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053414
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Давно про трехзвенку не баяли.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053417
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не перевелись ещё любители запускать поток и следующей строкой ожидать его завершения...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053422
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Любой поток должен либо выполнять задачу, либо ждать сигнала, после которого либо завершаться, либо начинать выполнять очередную задачу. Для Sleep тут места нет.
А теперь расскажи мне в рамках применительно к сервису? Напомню, у сервиса и автоматически создаваемого и используемого в нем потока TServiceThread есть 5 управляющих событий, которыми ОС управляет службой. Иных сигналов нет.
Внутри TServiceThread.Execute вызывается пользовательский код, который снаружи может получить всего 1 управляющий сигнал - terminate. Всё. Без сигнала завершения, после выполнения задачи и до перехода к следующему выполнению задачи сервис должен делиться ресурсами с другими приложениями в системе. Я так и не увидел, а каким образом это делается антогонистами sleep?

kdv
Кстати, я нашел аналогичное обсуждение, 5-летней давности, там такому же автору настучали канделябром.
https://stackoverflow.com/questions/33625164/service-application-in-delphi
А я вот смотрю заплюсованное решение Remy Lebeau и вижу:
Код: pascal
1.
2.
3.
4.
5.
6.
while not Terminated do
  begin
    Workflow.InsertInFile;
    Workflow.InsertInDatabase;
    TThread.Sleep(3000);
  end;

Как интересно))))
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053433
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
Внутри TServiceThread.Execute

Это часть кривой реализации для неофитов. Чтоб не сильно грузить их серое вещество сервисами и их внутренним миром. Считай, что это главный поток приложения. В нем sleep вреден в боевой обстановке.

Захочет винда твой сервис остановить, а он спит. И так три раза. И твой сервис помечается плохим словом.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053434
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
asutp2
Внутри TServiceThread.Execute

Это часть кривой реализации для неофитов. Чтоб не сильно грузить их серое вещество сервисами и их внутренним миром. Считай, что это главный поток приложения. В нем sleep вреден в боевой обстановке.

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

Хочешь увидеть код, где нет sleep? У меня весь такой код в боевых условиях. Sleep только для тестов и отладки.

Если не умеешь без sleep, то дело твое, но не стоит учить плохому остальных.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053438
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, sleep-ом не только "неофиты" балуются...

Другое дело, что это иногда выходит за пределы тестов:
Давно уже волновала лучшие умы нашей конторы проблема - почему Oracle Reports на Linux стартует на полминуты дольше, чем на винде? Из-за этого даже в своё время от его использования отказались.

И вот теперь британским учёным (в моём лице) удалось приподнять завесу тайны:

(gdb) disassemble rxmrun rxmrun+50
Dump of assembler code from 0x40398cd0 to 0x40398d02:

... (не очень интересно) ...

0x40398ce9 <rxmrun+25>: push 30
0x40398ceb <rxmrun+27>: call 0x8054eb8 <sleep>



То есть кто-то из индусских жрецов Оракла просто написал

sleep (30);


Интересно бы посмотреть в его однопиксельные глаза и задать ему пару вопросов.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053439
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет, вру...

Слипы применял, когда делал общение с медленными железками и по протоколу им нужно было время на подготовку ответа, а до этого нельзя с портом ничего делать. Написал, подождал 20 мс, читаешь ответ. Иначе никак. Но это, разумеется, делалось в доп.потоке, а не в основном, о чем я и говорю.
В основном потоке - без слипов.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053442
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

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

У меня так не получается, потому и показывать нечего.

Но если придумать задачу по твоему описанию: то это доп поток, который не спит, а ждет события с нужным таймаутом, например. И событие не всегда о работе, а иногда и об окончании работы. Sleep-же просто крадет время, на которое поток выбывает из цикла.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053452
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2,

имеется ввиду всего лишь замена Sleep на MsgWaitForXXX и код сразу становится кошерным
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053455
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman
Кстати, sleep-ом не только "неофиты" балуются...

Другое дело, что это иногда выходит за пределы тестов:
Давно уже волновала лучшие умы нашей конторы проблема - почему Oracle Reports на Linux стартует на полминуты дольше, чем на винде? Из-за этого даже в своё время от его использования отказались.

И вот теперь британским учёным (в моём лице) удалось приподнять завесу тайны:

(gdb) disassemble rxmrun rxmrun+50
Dump of assembler code from 0x40398cd0 to 0x40398d02:

... (не очень интересно) ...

0x40398ce9 <rxmrun+25>: push 30
0x40398ceb <rxmrun+27>: call 0x8054eb8 <sleep>



То есть кто-то из индусских жрецов Оракла просто написал

sleep (30);


Интересно бы посмотреть в его однопиксельные глаза и задать ему пару вопросов.


Там какой-то свой sleep? Потому что системный же в мсек параметр принимает. А 30мс никто не заметит
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053463
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
И я очень хочу увидеть реальный код балансировки использования процессоров в потоках у супер мега экспертов, не признающих sleep. А то слов много, реального кода - 0.
Какой нафиг sleep?! За это надо сразу убивать. Обычно используют группу вызовов xxxWaitForxxx.
Рихтер, Кларк "Программирование серверных приложений для Microsoft Windows 2000" ещё актуальна.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053479
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57
asutp2
И я очень хочу увидеть реальный код балансировки использования процессоров в потоках у супер мега экспертов, не признающих sleep. А то слов много, реального кода - 0.
Какой нафиг sleep?! За это надо сразу убивать. Обычно используют группу вызовов xxxWaitForxxx.
Рихтер, Кларк "Программирование серверных приложений для Microsoft Windows 2000" ещё актуальна.
Не вопрос, расскажи мне как нубу конкретный вызов xxxWaitForxxx в TServiceThread.Execute. Напоминаю, речь идет о стандартном потоке TServiceThread в TService, а не о дочерних порождаемых потоках внутри сервиса))))))
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053483
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Barmaley57
Какой нафиг sleep?! За это надо сразу убивать. Обычно используют группу вызовов xxxWaitForxxx.

Sleep тоже WaiFor... WaitFor[timer]
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053486
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
Barmaley57
Какой нафиг sleep?! За это надо сразу убивать. Обычно используют группу вызовов xxxWaitForxxx.

Sleep тоже WaiFor... WaitFor[timer]

Не тоже.

Давай без флуда.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053490
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
Иных сигналов нет.
Это ложное утверждение. Других сигналов миллион. В зависимости от того, что делает сервис. Это может быть событие от сокета, событие файловой системы, уведомление таймера...
asutp2
И я очень хочу увидеть реальный код балансировки использования процессоров в потоках у супер мега экспертов, не признающих sleep
Чтобы ответить на этот вопрос нужно получить ответ на такой
asutp2
осле выполнения задачи и до перехода к следующему выполнению задачи
каким образом сервис понимает, что нужно приступить к выполнению второй задачи?
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053493
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Но если придумать задачу по твоему описанию: то это доп поток, который не спит, а ждет события с нужным таймаутом, например. И событие не всегда о работе, а иногда и об окончании работы. Sleep-же просто крадет время, на которое поток выбывает из цикла.

1. Доп.поток - это TServiceThread, интегрированный в TService
2. TServiceThread.Execute ждет исключительно Terminate, остальные события приостановки/возобновления/рестарта - в ProcessRequests
3. Sleep возвращает ресурсы. Если помним, исходная проблема заключалась в том, что загрузка проца у службы была 15-20%. Начали делится ресурсами, загрузка стала 0%. И кого тут после этого нужно убивать? Тех, кто плюет на распределение ресурсов железа.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053500
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
asutp2
Иных сигналов нет.
Это ложное утверждение. Других сигналов миллион. В зависимости от того, что делает сервис. Это может быть событие от сокета, событие файловой системы, уведомление таймера...
Ты утверждаешь, что эти события относятся именно к TServiceThread, а не соответствующим дочерним потокам, отвечающих за соотвествующую обработку?

_Vasilisk_
asutp2
И я очень хочу увидеть реальный код балансировки использования процессоров в потоках у супер мега экспертов, не признающих sleep
Чтобы ответить на этот вопрос нужно получить ответ на такой
asutp2
осле выполнения задачи и до перехода к следующему выполнению задачи
каким образом сервис понимает, что нужно приступить к выполнению второй задачи?
Диспетчеризацией выполнения задач занимается дочерний поток/потоки, порожденный(порожденные) при создании экземпляра TService. Взаимодействуя с ним (ними), TServiceThread.Execute использует MsgWaitForXXX.

Но вопрос то заключается в том, как сам TServiceThread управляет нагрузкой на проц при собственном исполнении? Учитывая, что на современных процах код внутри исполняется за маленькое число тиков и с точки зрения системы аналогично
Код: pascal
1.
2.
while not terminated do
  a := a + 0;

в итоге имеем, что загрузка на ядре, на котором выполняется TServiceThread.Execute, становится недопустимо большой.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053503
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
Не вопрос, расскажи мне как нубу конкретный вызов xxxWaitForxxx в TServiceThread.Execute.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure ServiceExecute....
begin
  while not Terminated do
  begin
    if MsgWaitForMultipleObjects(n,handles[..],false,timeOut,QS_xxx)=yyy then zzz
    ...    
    ServiceThread.ProcessRequests(false);
    ...
  end;
end;
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053504
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
Ты утверждаешь, что эти события относятся именно к TServiceThread, а не соответствующим дочерним потокам, отвечающих за соотвествующую обработку?
asutp2
загрузка на ядре, на котором выполняется TServiceThread.Execute, становится недопустимо большой.
Уже неоднократно говорили: про ServiceExecute забыть вообще. В ServiceStart запускать свой поток, в ServiceStop его останавливать
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053510
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Уже неоднократно говорили: про ServiceExecute забыть вообще. В ServiceStart запускать свой поток, в ServiceStop его останавливать
Аргументация данного подхода? Пруфы на стековерфлоу, эмбу? Лично я не вижу необходимости повторять реализацию TServiceThread, он прекрасно справляется со своей задачей
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053511
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
TServiceThread, он прекрасно справляется со своей задачей
asutp2
TServiceThread.Execute ждет исключительно Terminate
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053515
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57
Код: pascal
1.
    if MsgWaitForMultipleObjects(n,handles[..],false,timeOut,QS_xxx)=yyy then zzz

прекрасно, учитывая что TServiceThread дочерние потоки как правило нужны только при завершении работы. Соответственно, а какие хэндлы передавать в MsgWaitForMultipleObjects (которых нет) при каждой итерации в нормальном режиме работы?)

Такое ощущение, что мне лечат за работу дочерних потоков в обычных приложениях, не понимая сути проблемы.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053516
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
asutp2
TServiceThread, он прекрасно справляется со своей задачей
asutp2
TServiceThread.Execute ждет исключительно Terminate
и? ты предлагаешь, чтобы я запускал свой поток, который работает точно так же как TServiceThread? )))
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053517
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но не забываем о сути проблемы, а именно о использовании ресурсов процессора. Как то все скромно этот вопрос умалчивают. Первый раз слышим, что нужно грамотно работать с ресурсами компов?
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053521
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
yemets63,

добавь Sleep(100) после ProcessRequests


Бизи вейты во сне и наяву...
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053522
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
..
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053528
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
Такое ощущение, что мне лечат за работу дочерних потоков в обычных приложениях, не понимая сути проблемы.
Такое ощущение, что ты знаешь много "умных" слов (типа ресурсы компов и т.д.), но не знаешь, что с этим делать...
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053530
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
Соответственно, а какие хэндлы передавать в MsgWaitForMultipleObjects
Да, собственно, любые хэндлы, которые сигнализируют твоему сервису, что нужно проснуться и выполнить работу, а не дёргаться постоянно в sleep'ах
...
Рейтинг: 0 / 0
пустой 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
пустой Service кушает до 15% ресурсов CPU
    #40053749
yemets63
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я склоняюсь читать и пробовать, создавать и внедрять, а не учить, у меня учить получается очень плохо, а вот что создавал, работает всё и достаточно хорошо при нагрузках.
в итоге на мой вопрос, коллеги, материал получился интересен, намного интереснее, чем любая книга.
спасибо тем, кто много знает, предлагает и учит. все молодцы!

и так, 2 варианта сервиса. 7 виртуальных PC с разными WIN версиями на тесте, нагрузили, вторые сутки полет нормальный. (запуски, перезапуски, обрывы, восстановление сессий, докачка и получение пакетов, ни одного технического сбоя).
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053750
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yemets63
я склоняюсь читать и пробовать, создавать и внедрять, а не учить, у меня учить получается очень плохо

Надо не читать и учить, а разбираться в предметной области.
Не судорожно пробовать, а следовать логическим выводам, полученным на основании исследования предметной области.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053755
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
yemets63
я склоняюсь читать и пробовать, создавать и внедрять, а не учить, у меня учить получается очень плохо, а вот что создавал, работает всё и достаточно хорошо при нагрузках.
в итоге на мой вопрос, коллеги, материал получился интересен, намного интереснее, чем любая книга.
спасибо тем, кто много знает, предлагает и учит. все молодцы!

Ты книжки Рихтера посмотри. Старые.

Рихтер Дж. - Windows. Создание эффективных Win32-приложений с учётом специфики 64-разрядной версии Windows
Рихтер Дж., Кларк Дж. - Программирование Серверных Приложений Для Microsoft Windows 2000.

Просто чума.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053916
yemets63
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

да да, ты прав, но я чуть не дописал, "не учить - не материал", а не учить других, у меня это получается плохо, а изучать и практиковать предметную область это моё, но иногда требуется мнение, может быть просто трёп, из которого некоторые кирпичики потом складываются правильно
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053963
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yemets63
YuRock,

да да, ты прав, но я чуть не дописал, "не учить - не материал", а не учить других, у меня это получается плохо, а изучать и практиковать предметную область это моё, но иногда требуется мнение, может быть просто трёп, из которого некоторые кирпичики потом складываются правильно
То, что ты сюда пришел не учить других - это понятно. Дай бог, чтоб сам научился чему-то хорошему (маловероятно, судя по развитию событий).
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40053974
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yemets63,

начни с того, что убери злосчастный sleep, а дальше эксперты научат
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054084
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а разжуйте мне пожалуйста, чем так плох sleep?
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054090
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
а разжуйте мне пожалуйста, чем так плох sleep?
1. Самое главное. Отсутствием возможности управления потоком, пока работает Sleep. Что приводит к дебильным тормозам.
2. Постоянным ненужным пробуждением/засыпанием потока каждые 100 миллисекунд (или сколько там передали в цикле со слипом), что влияет негативным образом на остальные потоки. Издевательство над машиной.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054091
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbчем так плох sleep?

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

начни с того, что убери злосчастный sleep, а дальше эксперты научат


Barmaley57
А давайте поговорим о использовании ресурсов процессора)) Почему sleep(100)? Почему не 1,10,1000,10000....? Откуда эта цифра взялась?
Давайте посмотрим на переключения контекста в счетчиках производительности.
Комментарии будут? Или "вы все п...сы, а я граф Монте-Кристо"?
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054126
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
cptngrb
а разжуйте мне пожалуйста, чем так плох sleep?
1. Самое главное. Отсутствием возможности управления потоком, пока работает Sleep. Что приводит к дебильным тормозам.
Возвращаемся к изначальной проблеме данного топика. Она заключалась в том, что у автора сервис постоянно занимал 15% процессорного ресурса.
В качестве простейшего решения было предложено использовать sleep, что в реальной эксплуатации привело к заниманию 0% процессорного ресурса у сервиса. Отзывчивость сервиса при этом не упала и ОС не ругалась грязными словами вида "служба не отвечает".

Но, как оказалось, эксперты увидели в этом сатанинское деяние. Не вопрос, автор ТС может спокойно удалить этот самый sleep и вернуться к исходной ситуации. Правда ни один из этих экспертов не показал реальный код, который бы позволил автору и не пользоваться sleep, и иметь 0% использование проца его службой.
YuRock
2. Постоянным ненужным пробуждением/засыпанием потока каждые 100 миллисекунд (или сколько там передали в цикле со слипом), что влияет негативным образом на остальные потоки. Издевательство над машиной.
Действительно, постоянные 0% это издевательство над машиной, а постоянные 15% - нет. Вырежу для себя в граните, чтобы никогда не забыть.

Barmaley57
asutp2
yemets63,

начни с того, что убери злосчастный sleep, а дальше эксперты научат


Barmaley57
А давайте поговорим о использовании ресурсов процессора)) Почему sleep(100)? Почему не 1,10,1000,10000....? Откуда эта цифра взялась?
Давайте посмотрим на переключения контекста в счетчиках производительности.
Комментарии будут? Или "вы все п...сы, а я граф Монте-Кристо"?
Я пользовался эмпирическим путем, который привел к 0% загрузке проца службой во время реальной эксплуатации. А вот ты, чтобы ты не причислял сам себя к "п...сам", я рекомендую тебе произвести соответствующие измерения и выложить здесь итоговую статистику и аналитику. Будет интересно сравнить.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054133
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2, что тебе непонятно в словах "счетчики производительности" и "переключения контекста"?
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054134
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё имеешь наглость здесь рассказывать про экономию ресурсов процессора...смех и только)
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054138
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57,

ты опять ничего не понял - я предлагаю именно тебе произвести подобные измерения, чтобы быть объективным. А то я намеряю, накручу показания и никакой им веры)))
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054139
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
произвести соответствующие измерения и выложить здесь итоговую статистику и аналитику. Будет интересно сравнить
Мне это не интересно сравнивать. Если тебе интересно - будь добр, потрудись.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054144
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57
Давайте посмотрим на переключения контекста в счетчиках производительности.
Barmaley57
Мне это не интересно сравнивать
Так ты сначала сам определись, интересно это тебе или нет?
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054151
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2, удачи!)
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054152
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
а разжуйте мне пожалуйста, чем так плох sleep?
Да религиозное это.
Типа эстетически не красиво и не идеально эффективно.

Хотя "проблемы" от нормально вставленного слипа в сервисе в реальной жизни яйца выеденного не стоят.
Подумаешь сервис на максимум секунду дольше останавливаться будет. Фигня.

Зато поставить sleep в разы проще и надежней чем городить огороды с event-ами.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054154
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
Правда ни один из этих экспертов не показал реальный код, который бы позволил автору и не пользоваться sleep
Ты уже не первый раз пишешь эту ложь.
Неоднократно предлагалось несколько нормальных решений этой проблемы:
1. Отказаться от ServiceExecute;
2. Использовать вместо Sleep MsgWait.
asutp2
Действительно, постоянные 0% это издевательство над машиной

Да, ведь это округленно.

asutp2
Я пользовался эмпирическим путем

Ты пользуешься методом пальцем в небо. Говорят, научно этот подход называется "Судорожное программирование".
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054157
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Хотя "проблемы" от нормально вставленного слипа в сервисе в реальной жизни яйца выеденного не стоят.

Подумаешь сервис на максимум секунду дольше останавливаться будет. Фигня.
Если так делать всегда и везде - это будет не фигня.
Будет самый настоящий говнокодище.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054159
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Если так делать всегда и везде - это будет не фигня.
Будет самый настоящий говнокодище.
Заговнокодить и с эвентами можно, причем это сделать проще.

Говнокод к слипу не имеет отношения.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054160
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
К слипу это не имеет отношения.
Ну конечно. Секунда моей жизни стоит дорого, я лично не хочу ее ждать при закрытии потока. Ты как хочешь.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054165
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Неоднократно предлагалось несколько нормальных решений этой проблемы:
1. Отказаться от ServiceExecute;
предлагалось без каких либо обоснований (еще раз, а где пруфы на подобные решения, например на стековерфлоу? на тикеты или хотя бы темы на форуме у Эмбы?). Написание собственного аналога TServiceThread? Ошуительно, с учетом того, что получим аналогичный результат.
YuRock
2. Использовать вместо Sleep MsgWait.
Вот именно, только предлагалось использование MsgWaitXXXX, но например приведение участка кода, который ТС вставить в свою службу и у него решится изначальная проблема - лично я так и не увидел. Покажи, где есть, я сам вставлю в одну из своих служб и протестирую.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054171
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
еще раз, а где пруфы на подобные решения, например на стековерфлоу? на тикеты или хотя бы темы на форуме у Эмбы?
Мне плевать на стековерфлоу и форумы. Я предлагаю как лучше, а следовать моим советам - личное дело каждого.

asutp2
Написание собственного аналога TServiceThread? Ошуительно, с учетом того, что получим аналогичный результат.

Бред какой. Не нужно ничего писать, никакого TServiceThread. Достаточно пустого потомка от TThread, в Execute которого - только работа, без всяких слипов и дебильной выкрутки никому не нужных сообщений.

asutp2
YuRock2. Использовать вместо Sleep MsgWait.
Вот именно, только предлагалось использование MsgWaitXXXX, но например приведение участка кода, который ТС вставить в свою службу и у него решится изначальная проблема - лично я так и не увидел. Покажи, где есть
Я лично противник этого подхода (не отрицая, при этом, что он существует). Потому искать такой рабочий код, а тем более писать - мне лень.
Ты же хочешь сравнить для общего развития - ты и пиши. Для меня это бесполезно.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054173
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Ну конечно. Секунда моей жизни стоит дорого, я лично не хочу ее ждать при закрытии потока. Ты как хочешь.
Экий ты нежный.

Так и вижу как ты весь рабочий день вручную, на сервере перезапускаешь сервисы, прямо вот аж каждые 5 минут.
С учетом потраты ~6 секунд в час за рабочий день будет "бесцельно потрачено" менее 1-й минуты времени.


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

Так и вижу как ты весь рабочий день вручную, на сервере перезапускаешь сервисы, аж каждые 5 минут.
С учетом потраты ~6 секунд в час за рабочий день будет "бесцельно потрачено" менее 1-й минуты времени.
Ты забываешь, что нервы с возрастом - ни к черту ;)
Таки ждать секунду - раздражает (когда знаешь, что можно было бы не ждать), хоть раз в неделю.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054179
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

ну вот видишь - дошли до пруфов и до конкретики, так опять сразу "ничего нет" и "лениво".

А вот если бы кто нибудь из экспертов привел простейший код службы, с одним потоком и без TServiceThread, и который кошерно работает - то и проблема у ТС была бы решена, и для других полезный навык. А иначе это всё лишь треп ниочем.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054188
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
который кошерно работает - то и проблема у ТС была бы решена
ТС не озвучил задачу. У него в бесконечном цикле ничего не происходит.
Кошерный код для такой задачи пишется так: File-New-Service. Копипастить не вижу смысла.

asutp2
А иначе это всё лишь треп ниочем.
Если человек не способен воспринимать информацию и делать выводы - то для него - всё трёп.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054198
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
работает в службах на разных серверах 24/7, загрузка ЦП 0%, это плохо, да?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure ServiceExecute(Sender: TService);
begin
    while not terminated  do
    begin
       ServiceThread.ProcessRequests(false);
       TThread.Sleep(1000);

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

ты что, меня за sleep(100) обвинили во всех грехах, какие только возможны)))
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054204
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
работает в службах на разных серверах 24/7, загрузка ЦП 0%, это плохо, да?
Да.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054209
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbзагрузка ЦП 0%, это плохо, да?

Да, это плохо. Смотреть загрузку ЦП исключительно таск менеджером это как минимум
непрофессионально. Так же непрофессионально как ничего не делающая программа.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054211
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
asutp2
который кошерно работает - то и проблема у ТС была бы решена
ТС не озвучил задачу. У него в бесконечном цикле ничего не происходит.
Кошерный код для такой задачи пишется так: File-New-Service. Копипастить не вижу смысла.

asutp2
А иначе это всё лишь треп ниочем.
Если человек не способен воспринимать информацию и делать выводы - то для него - всё трёп.
Другими словами, реального кода ты предоставить не можешь...
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054214
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, переключение контекста тоже в норме вроде. Где еще смотрят? Я ProcessExplorer'ом смотрю
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054215
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

cptngrbзагрузка ЦП 0%, это плохо, да?

Да, это плохо. Смотреть загрузку ЦП исключительно таск менеджером это как минимум
непрофессионально. Так же непрофессионально как ничего не делающая программа.

Конспектируем:
1. TService.Execute использовать нельзя, только собственная реализация. В Эмбе криворуки.
2. Диспетчер задач Windows использовать нельзя. В Microsoft криворуки.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054217
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Так же непрофессионально как ничего не делающая программа.
ТС на первой странице темы написал, что в первом сообщении ошибочно вырезал полезную нагрузку, ниже он это исправил и уточнил: 22294288
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054219
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2, последний вопрос: синица, воробей, птица, утка. Что лишнее?
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054231
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Ты забываешь, что нервы с возрастом - ни к черту ;)

Таки ждать секунду - раздражает (когда знаешь, что можно было бы не ждать), хоть раз в неделю.
Вообще-то, при Sleep(1000) лишнее ожидание составит в среднем пол секунды.

Но если это сложно, легким движением руки меняем Sleep(1000) на Sleep(100) и получаем "ожидание" в 50 мс.
Даже очень мнительный человек этого уже не заметит. Ни в сервис менеджере, ни в таск менеджере.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054236
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю, что православно использовать Event , но со sleep читать код проще и если у тебя не высоко-глубоко нагруженная система и никто из профессионалов не будет оценивать твой код, то нормально
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054239
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
Я так понимаю, что православно использовать Event , но со sleep читать код проще и если у тебя не высоко-глубоко нагруженная система и никто из профессионалов не будет оценивать твой код, то нормально
Неправильно понимаешь. Это не профессиональный а религиозный вопрос.

Прекрасно работать будет что так что так, если ошибок в коде не наделать.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054256
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
YuRock
пропущено...
ТС не озвучил задачу. У него в бесконечном цикле ничего не происходит.
Кошерный код для такой задачи пишется так: File-New-Service. Копипастить не вижу смысла.

пропущено...
Если человек не способен воспринимать информацию и делать выводы - то для него - всё трёп.
Другими словами, реального кода ты предоставить не можешь...
Для тебя - не могу. Нет смысла.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054258
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Вообще-то, при Sleep(1000) лишнее ожидание составит в среднем пол секунды.
Я невезучий :)
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054268
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2ТС на первой странице темы написал, что в первом сообщении ошибочно вырезал полезную нагрузку

Если сервис работает и что-то делает, то потребление процессора это нормально.
Если сервис ничего не делает, то его работа ждать внешних воздействий.

Sleep не вписывается ни в первый вариант (поскольку мешает дело делать), ни во второй
(поскольку мешает реагировать на эти самые воздействия).

Если кому-то нравится разогревать воздух крутя холостой цикл, то это действительно его
религиозные проблемы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054285
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
asutp2
пропущено...
Другими словами, реального кода ты предоставить не можешь...
Для тебя - не могу. Нет смысла.
Ты что то путаешь. не для меня, а ТС, который столкнулся с проблемой и попросил помощи в её решении.

Да и вообще показательно, что никто из тех, кто яростно поливает использование sleep(), не смогли предоставить работающее решение ТС-у. Чтобы человек смог доработать свой код, получив в результате работающий сервис с оптимальной нагрузкой на проц и работающий по кошерному.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054289
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2Да и вообще показательно, что никто из тех, кто яростно поливает использование sleep(), не
смогли предоставить работающее решение ТС-у.

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

Ну так-то нормальных рабочих примеров как работать иначе тут и не было.

Максимально близкий к реальности "пример" вот: 22294712

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

asutp2Да и вообще показательно, что никто из тех, кто яростно поливает использование sleep(), не
смогли предоставить работающее решение ТС-у.

Ты серьёзно пропустил ВСЕ упоминания WaitForXXXObjects в этом топикеВот как раз и хочется увидеть реальное использование WaitForXXXObjects в рамках задачи ТС. Ты видимо тоже не можешь привести работающий пример?)
Dimitry Sibiryakov
просто настолько тупо троллишь мстя за топик где из тебя так и не смогли вытрясти пример беспроблемной работы с PNG в FMX?..
Не, мне просто было лениво)
А вообще, если кто нибудь всё таки сподобится и выложит работающий кошерный код в рамках задачи ТС, то не вопрос, покажу код работы с png в fmx. Там действительно все элементарно, в fmx работа с графикой хоть и тормознее, но проще.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054297
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2Ты видимо тоже не можешь привести работающий пример?)

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


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
unit Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TTimedThread = class(TThread)
  public
    StopThread: THandle;

    constructor Create(CreateSuspended: Boolean); overload;
    destructor Destroy; override;
    procedure Execute; override;
  end;

  TMainForm = class(TForm)
    Start: TButton;
    Stop: TButton;
    procedure StartClick(Sender: TObject);
    procedure StopClick(Sender: TObject);
  private
    { Private declarations }
  public
    FThread: TTimedThread;
  end;


var
  MainForm: TMainForm;

implementation

{$R *.dfm}

{ TTimedThread }

constructor TTimedThread.Create(CreateSuspended: Boolean);
begin
  inherited;

  // Создаем событие завершения потока
  StopThread:=CreateEvent(nil, false, false, nil);
end;

procedure TTimedThread.Execute;
begin
  // Вечный цикл с задержкой в 1 сек, но с мгновенным выходом
  while WaitForSingleObject(StopThread, 1000) = WAIT_TIMEOUT do begin
    // Тут типа делаем работу в потоке
    Synchronize(procedure begin
      MainForm.Caption:=GetTickCount.ToString;
    end);
  end;
end;

destructor TTimedThread.Destroy;
begin
  // Удаляем событие
  CloseHandle(StopThread);

  inherited;
end;

procedure TMainForm.StartClick(Sender: TObject);
begin
  // Создаем и стартуем поток.
  FThread:=TTimedThread.Create(False);
  MainForm.Caption:='Start';
end;


procedure TMainForm.StopClick(Sender: TObject);
begin
  // Вызыввем событие выхода из потока
  SetEvent(FThread.StopThread);
  // дожидаемся завершения потока
  FThread.WaitFor;
  // убиваем поток
  FThread.Free;

  // конец.
  MainForm.Caption:='Stop';
end;

end.



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

так это же не сервис, а просто оконное приложение с доп потоком))) здесь как раз вопросов нет
интересует реализация в сервисе.

upd: проверку загрузки ЦП я буду проверять в первую очередь)
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054303
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

asutp2Ты видимо тоже не можешь привести работающий пример?)

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

так это же не сервис, а просто оконное приложение с доп потоком))) здесь как раз вопросов нет
интересует реализация в сервисе

Вместо TThread используешь TService.
Остальное по аналогии.
Там даже функции почти так же называются.

И даже проще, ибо не надо городить свой конструктор с деструктором.
У TService изначально события такие есть.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054310
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
А вообще, если кто нибудь всё таки сподобится и выложит работающий кошерный код в рамках задачи ТС
Это не возможно. Т.к. задача не опубликована
cptngrb
Код: pascal
1.
//проверки флагов состояний других потоков, крит. ошибок и т.п. 

Это ни о чем. Как эти флаги меняются? По каким событиям? Когда ТС опубликует задачу, тогда и будет решение. В рамках текущей формулировки ответ: использовать Wait функции.

Dimitry Sibiryakov
Если сервис работает и что-то делает, то потребление процессора это нормально.
Если сервис ничего не делает, то его работа ждать внешних воздействий.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054316
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Гони код.
22295844
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054317
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2,

Как уже ранее заметили - это не тот код.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054320
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, если ты про мой пример, то я проверяю ошибки в группах потоков, где флаг это байт, 0-все хорошо, 1-плохо, в других потоках я просто присваиваю при критической ошибке флагу = 1, а в службе проверяю. в зависимости от ошибок, либо перезапускаю службу, либо перезапускаю пул потоков.

в самом коде это выглядит примерно так
Код: pascal
1.
if err_byte = 1 then exit;
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054327
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
asutp2,

Как уже ранее заметили - это не тот код.
А что значит не тот? Всё работает как надо - прозрачность и цвета не портятся, на картинку добавляется зеленый цвет. Нужно изменить размеры результирующей картинки? Bitmap.SetSize и т.д...

И вообще достаточно интересно - в текущей теме никто, кроме тебя не соизволил привести работающий код (и то твой код далеко не про сервис и далеко не полный, так ведь :-) ) А я должен написать полноценный метод, решающий все проблемы в отрисовке? )))
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054329
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2,

Заметь ты это сам начал. ;)
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054333
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
Bitmap.SetSize и т.д...
Вот именно это и т.д. и интересует
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054339
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
asutp2
Bitmap.SetSize и т.д...
Вот именно это и т.д. и интересует
а меня интересует замена sleep-у. Что то от тебя вообще нет ни строчки кода. Покажи мне полноценный пример работы с сервисом с использованием WaitForXXX, с корректным использованием ЦП, тогда не вопрос, добавлю еще 3 строчки кода в формирование картинки в fmx
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054347
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
я проверяю ошибки в группах потоков, где флаг это байт, 0-все хорошо, 1-плохо, в других потоках я просто присваиваю при критической ошибке флагу = 1,
А теперь код.

Два события сервиса
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure TMyService.ServiceStart(Sender: TService; var Started: Boolean);
begin
  FWorkThread := TWorkThread.Create(False);
  Started := True;
end;

procedure TMyService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  FWorkThread.Free;
end;

сам поток
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
const
  TM_TERMINATE = WM_APP + 1;
  TM_ERROR = WM_APP + 2;

procedure TWorkThread.Execute;
var
  LRes: Cardinal;
  LMsg: TMsg;
begin
  while not Terminated do begin
    LRes := MsgWaitForMultipleObjects(0, nil, False, INFINITE, QS_POSTMESSAGE);
    case LRes of
      WAIT_FAILED: RaiseLastOsError;
      0: begin
        while PeekMessage(LMsg, 0, 0, 0, PM_REMOVE) do begin
          case LMsg.message of
            TM_TERMINATE: Terminated;
            TM_ERROR: ProcessError(TProcessThread(LMsg.wParam));
          end;
        end;
      end;
  end;
end;

procedure TWorkThread.ProcessError(AThread: TProcessThread);
begin
  // Здесь обрабатываем ошибку, которая  произошла  в потоке AThread
end;

procedure TWorkThread.ReportError(AThread: TProcessThread);
begin
  PostThreadMessage(ThreadId, TM_ERROR, WPARAM(AThread), 0);
end;

procedure TWorkThread.Destroy;
begin
  PostThreadMessage(ThreadId, TM_TERMINATE, 0, 0);
  inherited Destroy;
end;

И уведомление об ошибке из вычислительного потока
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TProcessThread.Execute;
begin
   ..........
   if IsError then
     WorkThread.ReportError(Self);
   ...........
end;

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

22294712
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054368
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

это рабочий код или из нотепада?
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054369
yemets63
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
классс тема,
вы чего курсовой делаете, одна тема на всю группу и кто лучше, у меня оба варианта сервиса уже третий день в тестировании. у обоих полет нормальный, не нашел критичных сбоев при разрывах.
пока работа идет дальше, расширяются задания сервисов и тут же тестируются, судя по тексту, многие готовы инвестировать свое время для обсуждения решений, при том читаю, почти одно и тоже в обоих стаканах, Thread или Sleep в цикле.
я все прочитал, реально круто, реально все очень много знают, но к сожалению создают не все и реально в "каки" прыгают не все, т.е. с заказчиками ни как, но и даже они тоже молодцы.

вот думаю, чтобы еще такого подкинуть, что у меня под вопросом времени лежит
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054371
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius
это рабочий код или из нотепада?
Прямо здесь писал с выдержками из реальных проектов. В чем-то проблема?
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054374
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Zelius
это рабочий код или из нотепада?
Прямо здесь писал с выдержками из реальных проектов. В чем-то проблема?
TM_TERMINATE: Terminated;
еd убрать
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054377
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
TM_TERMINATE: Terminated;
еd убрать
Да
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054450
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Прямо здесь писал с выдержками из реальных проектов. В чем-то проблема?

Если сразу после создания отправить потоку сообщение, он выдаст ошибку. Т.к. цикл выборки создается после первого PeekMessage тынц
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054460
Uridian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Код: pascal
1.
    TM_TERMINATE: Terminated;


почему не так?
Код: pascal
1.
    TM_TERMINATE: Exit;


или
Код: pascal
1.
    TM_TERMINATE: Break;
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054495
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Uridian
почему не так?
А почему нет? На OnTerminate может висеть какой-нибудь полезный обработчик. Кроме того обработка сообщений может быть не непосредственно в методе Execute, а в каком-нибудь вызываемом методе. Или даже происходить вот так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure TMyThread.DoMessage(const AMsg: TMsg);
var
  LMsg: TMessage;
begin
  LMsg.Msg := AMsg.message;
  LMsg.WParam := AMsg.wParam;
  LMsg.LParam := AMsg.lParam;
  LMsg.Result := 0;
  Dispatch(LMsg);
end;



Fr0sT-Brutal
Если сразу после создания отправить потоку сообщение, он выдаст ошибку
Это как повезет.
Fr0sT-Brutal
Т.к. цикл выборки создается после первого PeekMessage
Нет. Цикл обработки сообщений создается несколькими функциями. В том числе и MsgWaitForMultipleObjects. Другой вопрос, что можно успеть отправить сообщения до вызова MsgWaitForMultipleObjects. Если такое возможно, то нужно добавлять дополнительный код ожидания создания цикла.

У меня это делается так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
procedure TMyThread.Execute;
var
  LMsg: TMsg;
begin
  if Terminated then
    Exit;
  try
    // Initialize thread message queue
    PeekMessage(LMsg, 0, WM_USER, WM_USER, PM_NOREMOVE);
    try
      try
        DoInitialize;
      finally
        if FInitEvent <> 0 then
          SetEvent(FInitEvent);
      end;
   .........
end;

procedure TMyThread.AfterConstruction;
var
  LHandles: array[0..1] of THandle;
begin
  if NeedFullInit then begin
    LHandles[0] := CreateEvent(nil, False, False, nil);
    LHandles[1] := rsDuplicateHandle(Handle);
    FInitEvent := LHandles[0];
  end else
    FillChar(LHandles[0], SizeOf(LHandles[0]) * Length(LHandles), 0);
  try
    inherited AfterConstruction;
    if LHandles[0] <> 0 then
      Win32Check(WaitForMultipleObjects(2, @LHandles[0], False, INFINITE) <> WAIT_FAILED);
  finally
    if LHandles[0] <> 0 then begin
      CloseHandle(LHandles[0]);
      CloseHandle(LHandles[1]);
    end;
  end;
end;

...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054530
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вставлю свои 5 копеек насчёт использования Sleep.
Я считаю, что плох не сам факт использования Sleep(10 / 100 / 1000), а непонимание многими программистами того, к каким проблемам он приводит.
В штатном менеджере памяти ожидание блокировки блока выполняется через Sleep(1), что убивает масштабируемость многопоточного приложения. Важно знать, что Sleep(1) в менеджере памяти - это плохо, но практически в любой нашей программе он есть. Причем в данном случае плох Sleep(1) не тем, что приводит в увеличению счётчика переключения контекста (это ерунда), а тем, что в реальности Sleep(1) обычно длится 16 мс. Да и 1 миллисекунда - это жутко долго для менеджера памяти.

Если ожидание реализовано не через Sleep, а через объект ядра, то при переходе объекта ядра в сигнальное состояние функция WaitForXXX завершается намного быстрее, чем Sleep(1). Работа ждущего потока возобновляется за время от 5 до 50 микросекунд.

Но при этом нужно понимать, что во многих задачах не требуется организации ожидания какого-то события с точностью до микросекунды. Тогда Sleep(10 / 100) вполне может быть подходящим вариантом.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054562
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так скажу: тот, кто использует WaitForXXX - заводит будильник.
Тот, кто использует Sleep - просыпается каждую минуту чтобы посмотреть на часы.
Это вопрос личных привычек, конечно, но по-моему, первый выспится лучше.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054574
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Если ожидание реализовано не через Sleep, а через объект ядра, то при переходе объекта ядра в сигнальное состояние функция WaitForXXX завершается намного быстрее, чем Sleep(1). Работа ждущего потока возобновляется за время от 5 до 50 микросекунд.
Не может такого быть. Возобновление планирования потока ОС зависит от величины кванта в планировщике. Величина эта разная, в зависимости от настроек ОС, но это не микросекунды.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054595
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57
DmSer
Если ожидание реализовано не через Sleep, а через объект ядра, то при переходе объекта ядра в сигнальное состояние функция WaitForXXX завершается намного быстрее, чем Sleep(1). Работа ждущего потока возобновляется за время от 5 до 50 микросекунд.
Не может такого быть. Возобновление планирования потока ОС зависит от величины кванта в планировщике. Величина эта разная, в зависимости от настроек ОС, но это не микросекунды.


Я в прошлом году этому вопросу уделил очень много времени (во время написания статьи по многопоточному программированию). Поэтому я точно знаю, о чем пишу.
"Квант времени в планировщике" - это вообще не в тему!
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054599
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer, откуда взялись микросекунды? Что за магия происходит в ядре?
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054625
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При переводе объекта в сигнальное состояние ядро НЕМЕДЛЕННО предпринимает попытку возобновить работу ожидающего потока. Оно не ждёт миллисекунды или когда сработает системный таймер. Ядро ОС отыскивает наиболее свободное ядро процессора, ставит ожидающий поток в READY-очередь найденного ядра, а затем формирует программное прерывание для того, чтобы выполнить запуск потока из READY-очереди. Целевое ядро обрабатывает данное прерывание и передаёт контекст управления потоку, который находится в READY-очереди (там может уже и другой поток оказаться, как повезёт).
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054629
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054638
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer, да, ты прав! Проверил на Win7x64: задержка в среднем 3 мксек. Помнится, ковырял это дело на виндах постарей - там поток просто ставился в живую карусель и ждал своей очереди. Мелкомягкие переделали таки планировщик.
Спасибо за инфу!
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054644
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что плохо, нет функции типа SetEventAndWaitFor, поскольку довольно часто сразу после SetEvent приходится вставить в ожидание какого-то объекта ядра. Если бы такая функция была, то ожидающий поток можно было бы запускать в контексте текущего потока, а не планировать его на другое ядро и тратить время на программное прерывание. В этом случае многопоточность работала бы более эффективно.
А может такая функция и есть. Но мне не попадалась.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054646
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На всякий

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
program WaitTest;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Winapi.Windows,System.SysUtils,System.SyncObjs,System.Classes;

var
  time1,time2:int64;
  freq:int64;
  result:double;

type
  TCallBack=procedure;

  TWaitTestThread=class(TThread)
  private
    FEvent:TEvent;
    FReadyEvent:TEvent;
    FCallBack:TCallBack;
  protected
    procedure Execute;override;
    procedure TerminatedSet; override;
  public
    constructor Create(CallBack:TCallBack);
    procedure GetWaitTime;
    procedure WaitForReady;
  end;

{ TWaitTestThread }

constructor TWaitTestThread.Create(CallBack: TCallBack);
begin
  Inherited Create(false);
  FEvent:=TEvent.Create(nil,true,false,'');
  FReadyEvent:=TEvent.Create(nil,true,false,'');
  FCallback:=CallBack;
end;

procedure TWaitTestThread.Execute;
begin
  PulseEvent(FReadyEvent.Handle);
  while not Terminated do
  begin
    WaitForSingleObject(FEvent.Handle,INFINITE);
    QueryPerformanceCounter(time2);
    result:=1000000*((time2-time1) / freq);
    if not Terminated then FCallBack;
    PulseEvent(FReadyEvent.Handle);
  end;
end;


procedure TWaitTestThread.GetWaitTime;
begin
  QueryPerformanceCounter(time1);
  PulseEvent(FEvent.Handle);
  WaitForReady;
end;

procedure TWaitTestThread.TerminatedSet;
begin
  inherited;
  FEvent.SetEvent;
  FReadyEvent.SetEvent;
end;

procedure TWaitTestThread.WaitForReady;
begin
  WaitForSingleObject(FReadyEvent.Handle,INFINITE);
end;

procedure CallBack;
begin
  WriteLn(Format('Wait time=%f microsec',[result]));
end;

var
 WaitTestThread:TWaitTestThread;
begin
  QueryPerformanceFrequency(freq);

  WaitTestThread:=TWaitTestThread.Create(CallBack);
  WaitTestThread.WaitForReady;

  for var i := 1 to 10 do
  begin
    sleep(random(500));
    WaitTestThread.GetWaitTime;
  end;
  WaitTestThread.Free;
  WriteLn('Done...');
  ReadLn;
end.


...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054663
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
В штатном менеджере памяти ожидание блокировки блока выполняется через Sleep(1), что убивает масштабируемость многопоточного приложения. Важно знать, что Sleep(1) в менеджере памяти - это плохо, но практически в любой нашей программе он есть.
В моем штатном (getmem.inc) - нет, на старой версии дельфей.
Посмотрел FastMM4 - там, как я понял, это включается/отключается дефайном NeverSleepOnThreadContention и возможно под линуксом, т.к. только для fpc, и там Sleep - это не виндовый Sleep, а из clib.
Но я мог всё неправильно понять, конечно.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054666
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
А может такая функция и есть. Но мне не попадалась.
SignalObjectAndWait
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054676
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
DmSer
В штатном менеджере памяти ожидание блокировки блока выполняется через Sleep(1), что убивает масштабируемость многопоточного приложения. Важно знать, что Sleep(1) в менеджере памяти - это плохо, но практически в любой нашей программе он есть.
В моем штатном (getmem.inc) - нет, на старой версии дельфей.
Посмотрел FastMM4 - там, как я понял, это включается/отключается дефайном NeverSleepOnThreadContention и возможно под линуксом, т.к. только для fpc, и там Sleep - это не виндовый Sleep, а из clib.
Но я мог всё неправильно понять, конечно.


По умолчанию идет попытка захвата блокировки, затем Sleep(0), затем Sleep(1). Там используется модуль Windows.
Мне кажется было бы эффективнее реализовать цикл хотя бы из сотни Sleep(0), а только потом Sleep(1). В принципе, любой желающий это может сделать в любой момент :)
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054678
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57
DmSer
А может такая функция и есть. Но мне не попадалась.
SignalObjectAndWait


Супер! Спасибо!
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054681
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В нормальных менеджерах памяти этот цикл вообще без Sleep внутри. Но чисто потому, что там
защищаемый кусок кода мал сам по себе и на каждый поток по мере возможности выделяется
отдельная куча.

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

Но мы же в разделе Дельфи, а он для "программ, которые работают хоть как-то". Что данный
топик и доказывает.
Конечно. В других разделах что не программа - то произведение искусства))) Ты уж так сильно то не сгущай.
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054810
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Что данный топик и доказывает.

Barmaley57
В других разделах что не программа - то произведение искусства)))

- Дорогая, ты не права.
...
- Мама, он меня сукой назвал!
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054911
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57В других разделах что не программа - то произведение искусства)))

Ну почему? Раздел C#, вон, для "программ, которые работают хотя бы иногда".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054939
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
рубрика Сибирякова "языки программирования"
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40054995
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из Сибирякова по фразе. (с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
пустой Service кушает до 15% ресурсов CPU
    #40055355
yemets63
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем привет.

пишет автор топика, Да Всё классно и еще раз всем спасибо.

Но раз уж тут многие ГУРУ, я себя таким не очень считаю, я просто пытаюсь сделать юзерам то что они хотят и как хотят с минимум БАГов, у меня вопрос по службам.

Последние версиии XE, т.е. Delphi вроде как мультисистемны, а как мне собрать службу с минимумом запросов в рамках других систем, например под андроид, а лучше и под MAC.

P.S.
если про службу под Win мне хотелось профессиональное народное мнение, я его получил, то под Android и MAc, я хочу скопмпилировать всё из Delphi. Сейчас доступны три лицении Settle, Berlin и Sydney.
СПАСИБО
...
Рейтинг: 0 / 0
166 сообщений из 166, показаны все 7 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / пустой Service кушает до 15% ресурсов CPU
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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