Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.28;
Скачать: CL | DM;

Вниз

Вопрос по потокам, максимально грузит процессор!   Найти похожие ветки 

 
Андрей Пл   (2009-12-25 15:42) [0]

у меня есть модуль поток который периодически опрашивает какое то кол-во устройств номера которых расположены в таблице.
между опросами устройств в целом есть период...
вот код метода 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;


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


 
Palladin ©   (2009-12-25 15:43) [1]

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


 
sniknik ©   (2009-12-25 15:56) [2]

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

  if TimeCycle <= Now then

...


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


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


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

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


 
sniknik ©   (2009-12-25 16:28) [4]

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


 
sniknik ©   (2009-12-25 16:30) [5]

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


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


> var
>  TimeOprosa


Поэма


 
Anatoly Podgoretsky ©   (2009-12-25 16:34) [7]

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

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


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

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

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


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

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

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:53) [10]


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


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



Страницы: 1 вся ветка

Текущий архив: 2010.02.28;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
15-1260923205
Kerk
2009-12-16 03:26
2010.02.28
Счетчик посещаемости


15-1260821412
Elnino
2009-12-14 23:10
2010.02.28
Хранение файлов в БД


15-1260991862
KilkennyCat
2009-12-16 22:31
2010.02.28
SQL и куча пользователей.


2-1261799017
Igor2010
2009-12-26 06:43
2010.02.28
кодировка


11-1212303624
Сашик
2008-06-01 11:00
2010.02.28
Функция EncodeDate в KOL