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


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