Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по потокам, максимально грузит процессор! [D7, XP]


Андрей Пл ©   (2009-12-25 15:42:00) 

у меня есть модуль поток который периодически опрашивает какое то кол-во устройств номера которых расположены в таблице.
между опросами устройств в целом есть период...
вот код метода Execute:

procedure TPotokStatus.Execute;
var
 TimeOprosa:TDateTime;
begin
 TimeCycle:= Now;
 while not Terminated do
 begin

   if TimeCycle <= Now then
   begin
     FmInterf.tbStandPlace.Requery();  //таблицу с номерами устройств
     FmInterf.tbStandPlace.First;
     while (not tbStandPlace.Eof) and (not Terminated) do
     begin
       ...
       .... опрос одного устройства
       ...
       tbStandPlace.Next;   //получение номкра след. устройства
     end;
     TimeCycle:= IncMilliSecond(TimeCycle,PeriodOprosa);
   end;

 end;
end;


Вопрос:когда запускаю прогу то этот поток максимально грузит процессор.
Что посоветуете???


Сергей М.   (2009-12-25 16:53:00) [1]


> это заметно уменьшает нагрузку процессора


И сводит на нет все потуги по точной выдержке времени между "опоросами".
Ты же к этому времени еще 50 мс добавляешь)
Да и глупо расчитывать на выдержки времени с точностью до единиц миллисекунд - ОС-то не реального времени, а мультизадачная.


Андрей Пл   (2009-12-25 16:48:00) [2]

да если сделать вот так это заметно уменьшает нагрузку процессора.

procedure TPotokStatus.Execute;
var
TimeOprosa:TDateTime;
begin
TimeCycle:= Now;
while not Terminated do
begin
  sleep (50);
  if TimeCycle <= Now then
  begin
    FmInterf.tbStandPlace.Requery();  //таблицу с номерами устройств
    FmInterf.tbStandPlace.First;
    while (not tbStandPlace.Eof) and (not Terminated) do
    begin
      ...
      .... опрос одного устройства
      ...
      tbStandPlace.Next;   //получение номкра след. устройства
    end;
    TimeCycle:= IncMilliSecond(TimeCycle,PeriodOprosa);
  end;

end;
end;


Андрей Пл   (2009-12-25 16:42:00) [3]

))) там все правильно в этом смысле.
смотри как только я произвел опрос все устройств я задаю время когда надо опять начать их порос
TimeCycle:= IncMilliSecond(TimeCycle,PeriodOprosa);

оно и должно быть больше Now иначе опрос устройств опять сразу же запуститься....
потом едет внешний цикл который сравнивает
if TimeCycle <= Now then
как только время пришло пошел опять опрос...


Игорь Шевченко   (2009-12-25 16:34:00) [4]


> var
>  TimeOprosa


Поэма


Anatoly Podgoretsky   (2009-12-25 16:34:00) [5]

> Андрей Пл  (25.12.2009 15:42:00)  [0]

А зачем тебе тормозить работу потока? Ну если хочешь меньшую нагрузку то Sleep(N)


sniknik   (2009-12-25 16:30:00) [6]

у тебя там вообще период, вот и задавай период (слипом), зачем дату использовать?


sniknik   (2009-12-25 16:28:00) [7]

> вот в чем смысл:
тогда почему оно внутри условия? вот предстать ситуацию опрос занял 2 сек, а PeriodOprosa например 1... т.е. TimeCycle стал после одной сработки > Now, вопрос когда будет следующая сработка?


Андрей Пл   (2009-12-25 16:20:00) [8]


> а какой смысл в этом?
> ....
> TimeCycle:= Now;
> while not Terminated do
> begin
>
>   if TimeCycle <= Now then
> ...


вот в чем смысл:
TimeCycle:= IncMilliSecond(TimeCycle,PeriodOprosa);

мне нужно опрос делать всех устройств последовательно через заданный период времени.


sniknik   (2009-12-25 15:56:00) [9]

а какой смысл в этом?
....
TimeCycle:= Now;
while not Terminated do
begin

  if TimeCycle <= Nowthen

...


Palladin   (2009-12-25 15:43:00) [10]

sleep(0) (sleep(1)...sleep(50), по вкусу) в цикл


Наверх

Титульная страница Поиск, карта сайта Написать письмо