Форум: "Начинающим";
Текущий архив: 2010.02.28;
Скачать: [xml.tar.bz2];
ВнизВопрос по потокам, максимально грузит процессор! Найти похожие ветки
← →
Андрей Пл (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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c