![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по потокам, максимально грузит процессор! [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), по вкусу) в цикл