![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Помогите пожалуйста распределить нагрузку на технику.
Есть функция, она сравнивает строки в Memo1 и Memo2 (строки не повторяются), и выводит одинаковые в Memo3. При небольшом количестве строк (<100 например) программа работает быстро и правильно. Но если строк >2000, то подвисает, в диспетчере задач видно что потребление памяти не значительное, а вот процессор загружает на 100%. Подскажите пожалуйста средства с помощью которых в delphi можно ускорить работу программы и разгрузить проц (за счёт потребления памяти). Код:
procedure TForm1.Button3Click(Sender: TObject);
var
I,J,posSym:integer;
tmp1,tmp2:string;
begin
//Идём по строкам Memo1
for I := 0 to Memo1.Lines.Count - 1 do begin
tmp1:=Memo1.lines[i];
//Идём по строкам Memo2
for J := 0 to Memo2.Lines.Count - 1 do begin
tmp2:=Memo2.lines[J];
if CompareStr(tmp1,tmp2)=0 then begin
Memo3.Lines.Add(tmp1);
end;
end;
end;
end;Последний раз редактировалось Admin, 26.04.2010 в 13:05. |
|
#2
|
||||
|
||||
|
Ну а что ты хочешь? Большая задача - долгое время выполнения. Дабы не пугать пользователя зависшей программой могу предложить использование потока, с приоритетом выше среднего. А параллельно ему запускать какую нибудь анимашку, мол программа выполняется.
|
|
#3
|
||||
|
||||
|
Т.е. никак. Жалко. Пойду читать про потоки в Delphi.
Спасибо за ответ. |
|
#4
|
||||
|
||||
|
Во первых - работай не с TMemo, а с TStrigList - уберешь тормоза визуальные.
Во вторых - если исходные строки строки можно отсортировать - то скопрость можно еще увеличить. Ну и если совсем все плохо то AcedUtils |
|
#5
|
|||
|
|||
|
Держи, немного побыстрее будет, точнее в разы от твоего варианта.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
i, j :Integer;
begin
with Memo3.Lines do
begin
BeginUpdate;
Clear;
for i := 0 to Memo1.Lines.Count-1 do
for j := 0 to Memo2.Lines.Count-1 do
if CompareStr(Memo1.Lines[i],Memo2.Lines[j]) = 0 then
begin
Add(Memo1.Lines[i]);
Application.ProcessMessages;
end;
EndUpdate;
end;
end; |
|
#6
|
||||
|
||||
|
1) работай не с TMemo, а с TStrigList - сделано.
2) Сделал дополнительный Frame с ProgressBar-ом, И двумя кнопками: OK - ставится видимой после окончание сравнения. Abort - исчезает после окончание сравнения. Код:
procedure TForm1.Button3Click(Sender: TObject);
var
i, j:Integer;
begin
Frame11.Visible:=true;
with ListBox3.Items do begin
BeginUpdate;
Clear;
for i := 0 to ListBox1.Items.Count-1 do begin
for j := 0 to ListBox2.Items.Count-1 do begin
if CompareStr(ListBox1.Items[i],ListBox2.Items[j]) = 0 then begin
Add(ListBox1.Items[i]);
Application.ProcessMessages;
end;
Frame11.ProgressBar1.Position:=Round((100*((i-1)*ListBox2.Items.Count+j))/(ListBox1.Items.Count*ListBox2.Items.Count));
Frame11.Label2.Caption:=IntToStr(Frame11.ProgressBar1.Position)+'%';
end;
end;
EndUpdate;
end;
end;Красота. И прогрессбар движется и окно можно двигать, нет ощущения что процесс завис. Но ВОПРОС: как прервать основной поток программы кнопкой Abort? Т.е. Чтобы все вычисления которые сделаны остались, в ListBox3 стало видно то, что успело сравнится (Я потом оттуда в файл сохраняю). Последний раз редактировалось Esserg, 27.04.2010 в 16:38. |
|
#7
|
||||
|
||||
|
Цитата:
|