Текущий архив: 2005.03.20;
Скачать: CL | DM;
Вниз
Скорость работы программы во время выполнения цикла Найти похожие ветки
← →
ТехникПТО © (2005-03-03 19:40) [0]У меян в программе выполняеться большой цикл... и во время его выполнения.. программа "подвисает"... можно ли этого избежать??? чтобы не происходило подвисание программы...
← →
Alex_Petr © (2005-03-03 19:41) [1]Application.ProcessMessages ?
← →
ТехникПТО © (2005-03-03 19:42) [2]
> Application.ProcessMessages ?
а поподробнее?
← →
begin...end © (2005-03-03 19:45) [3]> ТехникПТО © (03.03.05 19:42) [2]
Подробнее: вставьте строку Application.ProcessMessages в тело цикла. Желательно, однако, вызывать ProcessMessages не на каждой итерации цикла, а по мере необходимости.
← →
Anatoly Podgoretsky © (2005-03-03 19:50) [4]И ответ по вопросу - скорость выполнения программы во время выполнения цикла не меняется.
← →
ТехникПТО © (2005-03-03 19:58) [5]
> Подробнее: вставьте строку Application.ProcessMessages в
> тело цикла. Желательно, однако, вызывать ProcessMessages
> не на каждой итерации цикла, а по мере необходимости
а в какое место цикла кидать?? в начало или в конец?
← →
ТехникПТО © (2005-03-03 20:00) [6]
> И ответ по вопросу - скорость выполнения программы во время
> выполнения цикла не меняется
идет чтение списка... обращение в процедуре которая проверяет.. имееться ли на странице такое слово или нет... если да то меняет цвет шрифта... учитывая скорость инета и другие факторы...
порой даже цикл вознобновляеться вновь до его окончания...т.е. он еще не успел обработаться полностью а его уже заного гонят.. дык как быть??
← →
default © (2005-03-03 20:04) [7]ТехникПТО © (03.03.05 20:00) [6]
откройте исходник Application.ProcessMessages и посмотрите что там делается чтобы не писать [5]
ТехникПТО © (03.03.05 20:00) [6]
АП туфту не говорит(по крайней мере я не видел ни разу)
так что прежде чем апелировать его словам думай и ищи ошибку у себя
скорость выполнения цикла изменится, но не программы
← →
DiamondShark © (2005-03-03 20:06) [8]
> а в какое место цикла кидать?? в начало или в конец?
Так ведь цикла твоего никто в глаза не видел.
← →
ТехникПТО © (2005-03-03 20:07) [9]
> АП туфту не говорит(по крайней мере я не видел ни разу)
> так что прежде чем апелировать его словам думай и ищи ошибку
> у себя
> скорость выполнения цикла изменится, но не программы
как ускорить скорость выполнения цикла?
← →
ТехникПТО © (2005-03-03 20:09) [10]
> Так ведь цикла твоего никто в глаза не видел.
procedure TForm1.SearchAndHighlightText(aText: string);
var
i: Integer;
doc:OleVariant;
begin
If Form8.CheckBox11.Checked=True then begin
try
doc:=Form1.EmbeddedWB1.oleobject.document.frames.item(2).document;
for i := 0 to Doc.All.Length - 1 do
begin
Application.ProcessMessages;
if (Pos(aText, Doc.All.Item(i).InnerText)<>0)
and (length(Doc.All.Item(i).InnerText)=length(aText)) then
begin
If Form8.checkBox1.Checked=true then Doc.All.Item(i).Style.BackGroundColor:=Form8.Edit1.Text;
If Form8.checkBox6.Checked=true then Doc.All.Item(i).Style.Color:=Form8.Edit2.Text;
exit;
end;
end;
except
end;
end;
If Form8.CheckBox13.Checked=True then begin
try
doc:=Form1.EmbeddedWB1.oleobject.document.frames.item(2).document;
for i := 0 to Doc.All.Length - 1 do
begin
Application.ProcessMessages;
if (Pos(aText, Doc.All.Item(i).InnerText)<>0)
and (length(Doc.All.Item(i).InnerText)=length(aText)) then
begin
If Form8.checkBox2.Checked=true then Doc.All.Item(i).Style.BackGroundColor:=Form8.Edit1.Text;
If Form8.checkBox8.Checked=true then Doc.All.Item(i).Style.Color:=Form8.Edit2.Text;
exit;
end;
end;
except
end;
end;
If Form8.CheckBox12.Checked=True then begin
try
doc:=Form1.EmbeddedWB1.oleobject.document.frames.item(2).document;
for i := 0 to Doc.All.Length - 1 do
begin
Application.ProcessMessages;
if (Pos(aText, Doc.All.Item(i).InnerText)<>0)
and (length(Doc.All.Item(i).InnerText)=length(aText)) then
begin
If Form8.checkBox5.Checked=true then Doc.All.Item(i).Style.BackGroundColor:=Form8.Edit1.Text;
If Form8.checkBox7.Checked=true then Doc.All.Item(i).Style.Color:=Form8.Edit2.Text;
exit;
end;
end;
except
end;
end;
If Form8.CheckBox14.Checked=True then begin
try
doc:=Form1.EmbeddedWB1.oleobject.document.frames.item(2).document;
for i := 0 to Doc.All.Length - 1 do
begin
Application.ProcessMessages;
if (Pos(aText, Doc.All.Item(i).InnerText)<>0)
and (length(Doc.All.Item(i).InnerText)=length(aText)) then
begin
If Form8.checkBox3.Checked=true then Doc.All.Item(i).Style.BackGroundColor:=Form8.Edit1.Text;
If Form8.checkBox9.Checked=true then Doc.All.Item(i).Style.Color:=Form8.Edit2.Text;
exit;
end;
end;
except
end;
end;
If Form8.CheckBox15.Checked=True then begin
try
doc:=Form1.EmbeddedWB1.oleobject.document.frames.item(2).document;
for i := 0 to Doc.All.Length - 1 do
begin
Application.ProcessMessages;
if (Pos(aText, Doc.All.Item(i).InnerText)<>0)
and (length(Doc.All.Item(i).InnerText)=length(aText)) then
begin
If Form8.checkBox4.Checked=true then Doc.All.Item(i).Style.BackGroundColor:=Form8.Edit1.Text;
If Form8.checkBox10.Checked=true then Doc.All.Item(i).Style.Color:=Form8.Edit2.Text;
exit;
end;
end;
except
end;
end;
end;procedure TForm1.EmbeddedWB1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var i:integer;
ovElements: OleVariant;
k:integer;
s:string;
begin
If Form8.CheckBox11.Checked=True then begin
try
For k:=0 to Form8.ListBox1.Count Do
Begin
Form8.ListBox1.ItemIndex:=k;
s:=Form8.ListBox1.items[Form8.ListBox1.ItemIndex];
SearchAndHighlightText(s);
end;
except
end;
end;
If Form8.CheckBox13.Checked=True then begin
try
For k:=0 to Form8.ListBox5.Count Do
Begin
Form8.ListBox5.ItemIndex:=k;
s:=Form8.ListBox5.items[Form8.ListBox5.ItemIndex];
SearchAndHighlightText(s);
end;
except
end;
end;
If Form8.CheckBox12.Checked=True then begin
try
For k:=0 to Form8.ListBox3.Count Do
Begin
Form8.ListBox3.ItemIndex:=k;
s:=Form8.ListBox3.items[Form8.ListBox3.ItemIndex];
SearchAndHighlightText(s);
end;
except
end;
end;
If Form8.CheckBox14.Checked=True then begin
try
For k:=0 to Form8.ListBox4.Count Do
Begin
Form8.ListBox4.ItemIndex:=k;
s:=Form8.ListBox4.items[Form8.ListBox4.ItemIndex];
SearchAndHighlightText(s);
end;
except
end;
end;
If Form8.CheckBox15.Checked=True then begin
try
For k:=0 to Form8.ListBox2.Count Do
Begin
Form8.ListBox2.ItemIndex:=k;
s:=Form8.ListBox2.items[Form8.ListBox2.ItemIndex];
SearchAndHighlightText(s);
end;
except
end;
end;
try
If Form3.CheckBox6.Checked=True then Form1.EmbeddedWB1.OleObject.Document.frames.Item(2).Document.Body.bgcolor:=Form3.Edit7.Text;
If Form3.CheckBox7.Checked=True then Form1.EmbeddedWB1.OleObject.Document.frames.Item(3).Document.Body.bgcolor:=Form3.Edit8.Text;
If Form3.CheckBox8.Checked=True then Form1.EmbeddedWB1.OleObject.Document.frames.Item(4).Document.Body.bgcolor:=Form3.Edit11.Text;
If Form3.CheckBox9.Checked=True then Form1.EmbeddedWB1.OleObject.Document.frames.Item(2).Document.Body.background:=Form3.edit13.Text;
If Form3.CheckBox10.Checked=True then Form1.EmbeddedWB1.OleObject.Document.frames.Item(3).Document.Body.background:=Form3.Edit13.Text;
If Form3.CheckBox11.Checked=True then Form1.EmbeddedWB1.OleObject.Document.frames.Item(4).Document.Body.background:=Form3.Edit14.Text;
except
end;
try
If mag=1 then begin
MagTime("Не удалось прочесть заклятие");
MagTime("Удачно использовано заклинание.");
end;
except
end;
← →
TUser © (2005-03-03 20:20) [11]
> for i := 0 to Doc.All.Length - 1 do
> begin
> Application.ProcessMessages;
if i mod 100 = 0 then
Application.ProcessMessages;
← →
Anatoly Podgoretsky © (2005-03-03 20:24) [12]ТехникПТО © (03.03.05 20:07) [9]
Application.MessageProcesses замедлит выполнение любого цикла, даже если он будет выполнен только один раз.
Его назначение не ускорять, а позволить обработать обработку поступивших сообщений. Сам Application.MessageProcesses в состоянии выполниться несколько миллионов раз в секунду, проверено полевыми измерениями.
← →
Anatoly Podgoretsky © (2005-03-03 20:27) [13]ТехникПТО © (03.03.05 20:09) [10]
Сам Application.ProcessMessages вставлен правильно, только я предпочитаю в конце цикла, что бы изменения пришли в действие.
А вот как понимать этлexcept
end;
Верной дорогой идете товарищи, только это путь на кладбище.
← →
ТехникПТО © (2005-03-03 20:29) [14]
> Application.MessageProcesses замедлит выполнение любого
> цикла, даже если он будет выполнен только один раз.
> Его назначение не ускорять, а позволить обработать обработку
> поступивших сообщений. Сам Application.MessageProcesses
> в состоянии выполниться несколько миллионов раз в секунду,
> проверено полевыми измерениями.
а как нибудь можно УСКОРИТЬ выполнение цикла?
← →
ТехникПТО © (2005-03-03 20:32) [15]
> А вот как понимать этл
> except
> end;
> Верной дорогой идете товарищи, только это путь на кладбище
а как нужно праввильно?
← →
Anatoly Podgoretsky © (2005-03-03 20:32) [16]Отказаться от POS внутри цикла, ты его вызываешь бесчисленное множество раз и каждый раз оно находит одно и тоже вложение.
← →
ТехникПТО © (2005-03-03 20:38) [17]
> Anatoly Podgoretsky
а что с except end; делать??
← →
Anatoly Podgoretsky © (2005-03-03 20:40) [18]Убрать как врага народа или возбуждать там специфическое исключение.
Немного офтопика, меня терзает любопытство. Что такое ПТУ я знаю, а что такое ПТО?
← →
ТехникПТО © (2005-03-03 20:42) [19]
> Убрать как врага народа или возбуждать там специфическое
> исключение.
> Немного офтопика, меня терзает любопытство. Что такое ПТУ
> я знаю, а что такое ПТО?
Производственно технический отдел :)
> специфическое исключение.
ето еще что за зверь??
P.S. я самоучка :) так что прошу не судить строго :)
← →
Anatoly Podgoretsky © (2005-03-03 20:44) [20]Тогда вам наверно надо принять программиста.
Или серьезно заняться самообучение по хорошим книгам, решать в них примеры.
← →
ТехникПТО © (2005-03-03 20:48) [21]
> Тогда вам наверно надо принять программиста.
>
> Или серьезно заняться самообучение по хорошим книгам, решать
> в них примеры.
программист у нас есть:) тока он по 1С.. точнее ОНА :)ъ
а на литературу денег не дают :( вот и лазю по форумам
← →
ТехникПТО © (2005-03-03 20:50) [22]а что мне с try except end делать?? после ошибки у меня аогоритм дальше не идет :(
← →
Anatoly Podgoretsky © (2005-03-03 20:52) [23]Подсказываю несколько источников знаний, по степени важности
1. Встроеная справка
2. Исходники Дельфи
3. Мой сайт, проект DDP, если силы хватит скачать эту уйму книг.
4. FAQ, базы знаний, советы
5. Чужие сайты
← →
ТехникПТО © (2005-03-03 20:54) [24]
> 3. Мой сайт, проект DDP, если силы хватит скачать эту уйму
> книг.
ето где??
← →
Anatoly Podgoretsky © (2005-03-03 21:12) [25]Если не умеешь пользоваться анкета, то хотя бы научись пользоваться поисковыми системы и Google и Yandex меня знают.
← →
ТехникПТО © (2005-03-03 21:13) [26]
> Если не умеешь пользоваться анкета, то хотя бы научись пользоваться
> поисковыми системы и Google и Yandex меня знают.
уже нашел :) может подскажете чем try except end заменить?
← →
Kolan © (2005-03-03 21:46) [27]Здравствуйте,
Мне тоже интересно, как правильно делать. Я тоже так бывает делаю. Напр
try
Result := A/B;
except
end;
Мне это подходит. Если B=0 то пользователь ничего не узнает об этом. Что тут неправильно?
← →
DiamondShark © (2005-03-03 21:48) [28]
> а как нибудь можно УСКОРИТЬ выполнение цикла?
Можно.
Во-первых, вынести из цикла инвариант.
for i := 0 to Doc.All.Length - 1 do
begin
Application.ProcessMessages;
if (Pos(aText, Doc.All.Item(i).InnerText)<>0) and
(length(Doc.All.Item(i).InnerText)=length(aText)) then
begin
If Form8.checkBox1.Checked=true then Doc.All.Item(i).Style.BackGroundColor:=Form8.Edit1.Text;
If Form8.checkBox6.Checked=true then Doc.All.Item(i).Style.Color:=Form8.Edit2.Text;
exit;
end;
end;
ЗдесьDoc.All
-- явный инвариант. Кроме того, это обращение очень "тяжёлое".
Так будет уже лучше:
var
elts: Variant;
...
elts := Doc.All;
for i := 0 to Doc.All.Length - 1 do
begin
Application.ProcessMessages;
if (Pos(aText, elts.Item(i).InnerText)<>0) and
(length(elts.Item(i).InnerText)=length(aText)) then
begin
If Form8.checkBox1.Checked=true then elts.Item(i).Style.BackGroundColor:=Form8.Edit1.Text;
If Form8.checkBox6.Checked=true then elts.Item(i).Style.Color:=Form8.Edit2.Text;
exit;
end;
end;
Во-вторых, кэшировать "тяжёлые" вычисления в цикле.
elts.Item(i) вычисляется много раз внутри цикла. Но это метод объекта. И вызывается он с использованием позднего связывания, а это тяжёлая операция.
Несколько раз вызывается и свойство style. Тоже затраты на вызов с поздним связыванием.
Ну и наконец условие(Pos(aText, elt.InnerText)<>0) and (length(elt.InnerText)=length(aText))
логически эквивалентно простоaText = elt.innerText
(+ X=true эквмвалентно просто X)
Так будет лучше:
var
elts: Variant;
elt: Variant;
style: Variant;
...
elts := Doc.All;
for i := 0 to Doc.All.Length - 1 do
begin
Application.ProcessMessages;
elt := elts.Item(i);
if aText = elt.InnerText then
begin
If Form8.checkBox1.Checked then elt.Style.BackGroundColor:=Form8.Edit1.Text;
If Form8.checkBox6.Checked then elt.Style.Color:=Form8.Edit2.Text;
exit;
end;
end;
Ещё более радикальное ускорение даст отказ от использования позднего связывания и использовать интерфейсы.
> а что с except end; делать??
Как ни странно, не допускать возникновения исключений.
Они ведь отчего появляются? От того, что в Doc.all попадают все тэги, у некоторых из которых нету тех свойств, к которым идёт обращение (например, innerText, или style). Так ведь?
Это и к скорости, кстати, имеет отношение. Может быть, что проверка элемента, или уточнение условия отбора (скажем, использовать не all, а all.tags(...)) окажется менее затратным, чем возбуждение и удавление исключения.
ЗЫ
А вообще-то, алкогоритм просто ужасный...
← →
ТехникПТО © (2005-03-03 21:53) [29]
> А вообще-то, алкогоритм просто ужасный...
знаю... :( не умею я писать рационально.. меня все учителя и преподы гоняют за это :)
← →
jack128 © (2005-03-03 21:58) [30]Kolan © (03.03.05 21:46) [27]
Что тут неправильно?
то, что результат функции в случае если B = 0 неопределен.
← →
Kolan © (2005-03-03 22:01) [31]Ну
Result := 0;
try
Result := A/B;
except
end;
так правильно?
Try
except"ом я просто не даю появится окну ошибки и прервать вычисления.
← →
Anatoly Podgoretsky © (2005-03-03 22:02) [32]jack128 © (03.03.05 21:58) [30]
Kolan © (03.03.05 21:46) [27]
Как справедливо замтил Джек, неопределенный результат, такого даже врагу не пожелаешь.
А правильно так:
try
Result := A/B;
except
Result := бесконечность; // или скажем значение по договоренности, но лучше исключение, там будет однозначность.
end;
Мне это подходит. Если B=0 то пользователь ничего не узнает об этом. Что тут неправильно?
Хуже он получить черт знает что.
← →
DiamondShark © (2005-03-03 22:06) [33]
> except"ом я просто не даю появится окну ошибки и прервать
> вычисления.
А понту от твоих непрерванных вычислений на некорректных данных?
← →
GuAV © (2005-03-03 23:14) [34]Anatoly Podgoretsky © (03.03.05 22:02) [32]
Kolan © (03.03.05 21:46) [27]
IMHO правильно так:
Result := A/B;
В случае ошибки пользователь увидит сообщение об ошибке.
или так:
SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, exOverflow, exUnderflow, exPrecision]);
Result := A/B;
Если B = 0 исключения не будет, результат будет бесконечность (или NAN если A тоже 0).
← →
Anatoly Podgoretsky © (2005-03-03 23:30) [35]Второй вариант ьолее правильный, Интел и не только он требует от разработчиков компиляторов и программистов именно это - соответствие законам математики, деление на ноль не ошибка, а бесконечность, при А не равном нулю.
Result := бесконечность; // или скажем значение по договоренности, но лучше исключение, там будет однозначность.
← →
Anatoly Podgoretsky © (2005-03-03 23:31) [36]Для исключения защищенный блок не требуется.
← →
Eraser © (2005-03-03 23:54) [37]ТехникПТО ©
Как уже говорили- алогоритм не очень...
Попробуй применить многопоточность...
← →
GuAV © (2005-03-04 00:24) [38]ТехникПТО © (03.03.05 20:09) [10]
if (Pos(aText, Doc.All.Item(i).InnerText)<>0)
and (length(Doc.All.Item(i).InnerText)=length(aText)) then
э.. это что ?
(Pos(aText, Doc.All.Item(i).InnerText)<>0) текст aText содержится в InnerText"е элемента.
(length(Doc.All.Item(i).InnerText)=length(aText)) длины текста aText InnerText"а элемента совпадают.
Если оба условия выполняются, то эти строки равны.
Т.е. может просто CompareStr (или другую ф-цию сравнения) ?
← →
GuAV © (2005-03-04 00:25) [39]упс... было уже..
← →
Kolan © (2005-03-04 01:03) [40]
> DiamondShark © (03.03.05 22:06) [33]
>А понту от твоих непрерванных вычислений на некорректных данных?
А такой понт, что допустим у меня устройсво по сложному мереет изделия определенного вида где есть Мах и Min значение причем
Max всегда преред Min. А пользователь допустим не то изделее засунул или диапазон не тот взял. А у меня в обработки Sqrt(Min - Max) получаю под корнем -, а пользователь ошибки и нервничает. Нафиг они ему нужны он и по графику видит, что ошибся. А может и не ошибся прости график хотел построить а на вычисления ему пох.
> SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide,
> exOverflow, exUnderflow, exPrecision]);
OK Приму к сведению.
Страницы: 1 2 вся ветка
Текущий архив: 2005.03.20;
Скачать: CL | DM;
Память: 0.59 MB
Время: 0.027 c