|
|
Регистрация | << Правила форума >> | 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
|
||||
|
||||
Цитата:
TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |