powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / пустой Service кушает до 15% ресурсов CPU
25 сообщений из 166, страница 6 из 7
пустой 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
25 сообщений из 166, страница 6 из 7
Форумы / Delphi [игнор отключен] [закрыт для гостей] / пустой Service кушает до 15% ресурсов CPU
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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