Форум: "Основная";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
ВнизПрограмма загружает процессор Найти похожие ветки
← →
oleg krechetov (2004-09-30 06:41) [0]Доброго времени суток.
Есть программка опроса Сом - порта, на порту висит семь приборов, которые опрашиваются в цикле, цикл бесконечный, т.е. заканчивается принудительно. Программа при работе загружает процессор до 99%. Что можно сделать, как решить эту проблему. Хочу услышить Ваши мнения по решению этого вопроса.
← →
MBo © (2004-09-30 06:54) [1]Опрос нужно проводить в дополнительном потоке (см. TThread)
← →
Fedia (2004-09-30 07:15) [2]Лучше чем [1] едва ли можно придумать, но у меня такой вариант:
после каждого шага цикла выполнять
Sleep(1000);
Application.ProcessMessages;
Интервал приостановки программы может варьироваться в зависимости от времени выполнения каждого шага цикла.
← →
КаПиБаРа © (2004-09-30 08:08) [3]MBo © (30.09.04 6:54) [1]
Опрос нужно проводить в дополнительном потоке (см. TThread)
В дополнительном потоке бесконечный цикл не будет грузить процессор на 100%?
oleg krechetov (30.09.04 6:41)
Попробую погодать на кофейной гуще. Вставь sleep(0) в цикл опроса.
← →
Fedia (2004-09-30 08:32) [4]>В дополнительном потоке бесконечный цикл не будет грузить процессор на 100%?
Если больше ни один из процессов не будет требовать процессорного времени, то может загрузить и на 100%. Но дополнительному потоку легко присвоить низкий приоритет, а в этом случае разрабатываемая программа будет охотно делиться процессорным временем с другими приложениями.
P.S. sleep(0) едва ли поможет.
← →
MBo © (2004-09-30 08:52) [5]>КаПиБаРа © (30.09.04 08:08) [3]
если в цикле опроса во втор. потоке вставлять sleep, то основной поток будет нормально работать, GUI будет откликаться. Конечно, более разумно, чтобы вторичный поток не тратил зря проц. время, а спал и ждал событий (wait-функции)
← →
КаПиБаРа © (2004-09-30 09:30) [6]Fedia (30.09.04 8:32) [4]
P.S. sleep(0) едва ли поможет
Sleep(1) поможет.
Низкий приоритет при опросе внешних устройств подключенных на Com порт? Думаете это правильно?
← →
Fedia (2004-09-30 10:04) [7]КаПиБаРа © (30.09.04 09:30) [6]
Я думаю что это будет работать. А вот загружать процессор на 99% совсем неправильно. Тем более что вопрос возник именно из-за этого.
Кроме того, никто и не утверждает, что вариант со sleep никуда не годится
← →
KSergey © (2004-09-30 11:11) [8]Ну грузит. А в чем проблема-то?
← →
simpson © (2004-09-30 11:15) [9]> oleg krechetov (30.09.04 06:41)
> опрашиваются в цикле, цикл бесконечный, т.е.
> заканчивается принудительно
А нельзя ли увидеть код, который, собственно, производит опрос?
← →
Erik1 © (2004-09-30 12:18) [10]А применить копронент для работы с com портом гордость непозdоляет? Еще раз говорю если незнаеш как работать с устройствами используй готовые наработки. Они умеют работать с com портом в асинхроном режимеи вобще незагружают процесор. Еще можно по этому форому предварительно поиск сделать!
← →
oleg krechetov (2004-09-30 12:29) [11]
procedure TForm1.ReadPribor(Pribor:integer);
const
Hour = 3600000/MSecsPerDay;
var
SS:ShortString;
II, K:integer;
TU:double;
CHAN:DWORD;
U:boolean;//
T:TDateTime;
AppPath:string;
begin
AppPath:= ExtractFilePath(Application.ExeName);
Query.DatabaseName:=AppPath+"DataBase\";
DwrdStop:=0;
CHAN:=0;{}
if not ComOpen(NumCom) then
begin
MessageDlg(ErrToStr(ComError),mtError,[mbCancel],0);
exit;
end;
if DwrdStop<>0 then
begin
ComClose;
end;
repeat
SS:="6;"+IntToStr(CHAN*8)+";8;";;
U:=ExChange(SS,Pribor,TimeOut);
if DwrdStop<>0 then
begin
ComClose;
CloseDataBase;
end;
if CHAN=0 then
begin
if Pribor = 1 then
begin
StatusBar2.Panels.Items[0].Text:="Ñòàòóñ: Îïðàøèâàåòñÿ ïðèáîð ¹ "+IntToStr(Pribor);
NumPribor:=Pribor;
ExitPribor:=Pribor;
Edit1.Text:=ANS[0];
Edit2.Text:=ANS[1];
if (StrToInt(ANS[2])<100) or (StrToInt(ANS[2])>1200) or((ANS[2])="$0")or((ANS[2])="$1") or((ANS[2])="$3") or((ANS[2])="$6") or((ANS[2])="$8")or((ANS[2])="$9") then
Edit3.Color:=clRed
else
Edit3.Color:=clBtnFace;
Edit3.Text:=ANS[2];
if(StrToInt(ANS[3])<100)or(StrToInt(ANS[3])>1100)or((ANS[3])="$0") or((ANS[3])="$1") or((ANS[3])="$3") or((ANS[3])="$6") or((ANS[3])="$8") or((ANS[3])="$9") then
Edit4.Color:=clRed
else
Edit4.Color:=clBtnFace;
Edit4.Text:=ANS[3];
if (StrToInt(ANS[4])<100) or (StrToInt(ANS[4])>1100) or((ANS[4])="$0")
or((ANS[4])="$1") or((ANS[4])="$3") or((ANS[4])="$6") or((ANS[4])="$8")
or((ANS[4])="$9") then
Edit5.Color:=clRed
else
Edit5.Color:=clBtnFace;
Edit5.Text:=ANS[4];
if (StrToInt(ANS[5])<-50) or (StrToInt(ANS[5])>50) or((ANS[5])="$0")
or((ANS[5])="$1") or((ANS[5])="$3") or((ANS[5])="$6") or((ANS[5])="$8")
or((ANS[5])="$9") then
Edit6.Color:=clRed
else
Edit6.Color:=clBtnFace;
Edit6.Text:=ANS[5];
if ((ANS[6])="$0")
or((ANS[6])="$1") or((ANS[6])="$3") or((ANS[6])="$6") or((ANS[6])="$8")
or((ANS[6])="$9") then
Edit55.Color:=clRed
else
Edit55.Color:=clBtnFace;
Edit55.Text:=ANS[6];
if ((ANS[7])="$0")
or((ANS[7])="$1") or((ANS[7])="$3") or((ANS[7])="$6") or((ANS[7])="$8")
or((ANS[7])="$9") then
Edit56.Color:=clRed
else
Edit56.Color:=clBtnFace;
Edit56.Text:=ANS[7];
OpenDataBase;
SaveDataBase;
CloseDataBase;
end;
end;
//--------------------------------------------------------------
inc(CHAN);
if CHAN>0 then
begin
CHAN:=0;
inc(Pribor);
if Pribor = 8 then
begin
Pribor:=1;
end;
TU:=Now;
while ((TU+4*1.1574e-5)>Now) and (DwrdStop=0) do Application.ProcessMessages; // Задержка 4 сек.
end;
← →
oleg krechetov (2004-09-30 12:30) [12]until DwrdStop<>0;
end;
Пришлось сократить все не входит :( . Отдельный поток поможет, в работе с пользовательскими процедурами - ButtonClick и д.р. Но он вряд ли уменьшит загрузку процессора. :(
← →
simpson © (2004-09-30 12:36) [13]> oleg krechetov (30.09.04 12:29) [11]
О, ужас... :(
Какой тут COM-порт, если человек регулярно пишет конструкции типа
begin
ComClose;
end;
Кроме того, где текст ComOpen и где собственно ожидание со чтением?
Это просто песня:
while ((TU+4*1.1574e-5)>Now) and (DwrdStop=0) do Application.ProcessMessages; // Задержка 4 сек.
Работу с портом в дополнительный поток, однозначно.
← →
DiamondShark © (2004-09-30 13:59) [14]
> и где собственно ожидание со чтением?
Вмдимо, тут:
U:=ExChange(SS,Pribor,TimeOut);
Весь остальной код, мало, что ужасный, так ещё и никакого отношения к порту не имеет.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.033 c