noveek 27 Posted February 14, 2016 Не понимаю почему отказывается удалять дубликаты строк в потоке хотя строки всё таки пересортировывает нормально ! Подскажите что делаю не правильно ? unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; CheckBox1: TCheckBox; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; //Поток 1 TMyThread = class(TThread) private { Private declarations } protected procedure Execute; override; end; var Form1: TForm1; MyThread: TMyThread; s1: TStringList; s2:TStringList; implementation {$R *.dfm} procedure TMyThread.Execute; var i:integer; begin S1.LoadFromFile('dup.txt'); s1.Sorted := True; s1.Duplicates := dupIgnore; for i :=0 to s1.Count-1 do begin s2.add(s1[i]); end; S2.SaveToFile('nodup.txt'); Showmessage('True'); end; procedure TForm1.Button1Click(Sender: TObject); begin S2 := TStringList.Create(); S1 := TStringList.Create(); MyThread:=TMyThread.Create(false); MyThread.Priority:=tpNormal; end; end. Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #313619 Posted February 14, 2016 s1.Duplicates := dupIgnore;Наверное должно быть s2.Duplicates := dupIgnore; Quote Share this post Link to post Short link Share on other sites
noveek 27 #313621 Posted February 14, 2016 Наверное должно быть s2.Duplicates := dupIgnore; Нет ! И дело не в этом S2 лишь добавляет в свой лист уже отсортированные и без дубликатов S1 Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #313622 Posted February 14, 2016 Нетпочему нет, если да) Quote Share this post Link to post Short link Share on other sites
noveek 27 #313623 Posted February 14, 2016 почему нет, если да) Ну попробуй сам сначала Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #313625 Posted February 14, 2016 (edited) Ну попробуй сам сначалаЗачем мне пробовать?устанавливать свойства объекта нужно до работы с его методами. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; CheckBox1: TCheckBox; procedure Button1Click(Sender: TObject); private public end; //Поток 1 TMyThread = class(TThread) private protected procedure Execute; override; end; var Form1: TForm1; MyThread: TMyThread; s1: TStringList; s2: TStringList; implementation {$R *.dfm} procedure TMyThread.Execute; var i:integer; begin S1.LoadFromFile('dup.txt'); for i :=0 to s1.Count-1 do s2.add(s1[i]); S2.SaveToFile('nodup.txt'); Showmessage('True'); end; procedure TForm1.Button1Click(Sender: TObject); begin S2 := TStringList.Create(); S2.Duplicates := dupIgnore; S1 := TStringList.Create(); S1.Sorted := True; S1.Duplicates := dupIgnore; MyThread:=TMyThread.Create(false); MyThread.Priority:=tpNormal; end; end. Edited February 14, 2016 by ShadowHunterRUS Quote Share this post Link to post Short link Share on other sites
noveek 27 #313626 Posted February 14, 2016 (edited) Зачем мне пробовать? устанавливать свойства объекта нужно до работы с его методами. Главное в твоём коде весь смысл многопоточности приложения теряется =) Edited February 14, 2016 by noveek Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,212 #313633 Posted February 14, 2016 S1 и S2 должны быть локальными переменными класса-потока. Только в этом случае результат будет ожидаемым. Если же это переменные вне класса, то для работы с ними придется использовать синхронизацию. procedure MyThread.Update; begin .... end; procedure MyThread.Execute; begin Synchronize(Update); end; И конечно же в этом случае паралльеной работы потока с главной нитью не происходит. По этой причине вам лучше сделать списки локальными внутри класса-потока, а инфу в них передать либо переопределив Create класса-потока, либо создав свойства у класса-потока и присвоив им значения до вызова Execute. Также при работе с TStringsList следует использовать BeginUpdate и EndUpdate это существенно ускорит обработку инфы внутри них. 1 Quote Share this post Link to post Short link Share on other sites
noveek 27 #313644 Posted February 14, 2016 S1 и S2 должны быть локальными переменными класса-потока. Только в этом случае результат будет ожидаемым. Если же это переменные вне класса, то для работы с ними придется использовать синхронизацию. И конечно же в этом случае паралльеной работы потока с главной нитью не происходит. По этой причине вам лучше сделать списки локальными внутри класса-потока, а инфу в них передать либо переопределив Create класса-потока, либо создав свойства у класса-потока и присвоив им значения до вызова Execute. Также при работе с TStringsList следует использовать BeginUpdate и EndUpdate это существенно ускорит обработку инфы внутри них. Не помогло ! unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; CheckBox1: TCheckBox; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; //Ïîòîê 1 TMyThread = class(TThread) private { Private declarations } protected procedure Update; procedure Execute; override; end; var Form1: TForm1; MyThread: TMyThread; implementation {$R *.dfm} procedure TMyThread.Execute; begin Synchronize(Update); end; procedure TMyThread.Update; var i:integer; s1: TStringList; s2:TStringList; begin S1 := TStringList.Create; S2 := TStringList.Create; S1.LoadFromFile('dup.txt'); s1.Sorted := True; for i :=0 to s1.Count-1 do begin s1.Duplicates := dupIgnore; s2.add(s1[i]); end; S2.SaveToFile('nodup.txt'); Showmessage('True'); end; procedure TForm1.Button1Click(Sender: TObject); begin MyThread:=TMyThread.Create(false); MyThread.Priority:=tpNormal; end; end. Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #313646 Posted February 14, 2016 (edited) s1.Duplicates := dupIgnore;вы не тупите, а прочитайте доки. это свойство нужно задавать для s2 всего 1 раз, а не для s1 еще и в цикле. Edited February 14, 2016 by ShadowHunterRUS Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,212 #313649 Posted February 14, 2016 (edited) Зачем вы применяете синхронизацию если у вас локальные переменные? А где у вас уничтожение списков? Ну и настройку не правильно делаете. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; CheckBox1: TCheckBox; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TMyThread = class(TThread) protected procedure Execute; override; end; var Form1: TForm1; MyThread: TMyThread; implementation {$R *.dfm} procedure TMyThread.Execute; var i:integer; s1, s2: TStringList; begin s1 := TStringList.Create; s1.LoadFromFile('dup.txt'); s2 := TStringList.Create; s2.Sorted := True; s2.Duplicates := dupIgnore; s2.BeginUpdate; for i :=0 to s1.Count-1 do s2.add(s1[i]); s2.EndUpdate; s2.SaveToFile('nodup.txt'); s1.Free; s2.Free; Showmessage('True'); end; procedure TForm1.Button1Click(Sender: TObject); begin MyThread:=TMyThread.Create(false); MyThread.Priority:=tpNormal; end; end. Edited February 14, 2016 by StranikS_Scan 1 Quote Share this post Link to post Short link Share on other sites
noveek 27 #313650 Posted February 14, 2016 (edited) вы не тупите, а прочитайте доки. это свойство нужно задавать для s2 всего 1 раз, а не для s1 еще и в цикле. Да что ты со своим S2 привязался если файл с дубликатами грузится в S1, а S2 только сохраняет в файл Зачем вы применяете синхронизацию если у вас локальные переменные? А где у вас уничтожение списков? Ну и настройку не правильно делаете. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; CheckBox1: TCheckBox; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; //Ïîòîê 1 TMyThread = class(TThread) private { Private declarations } protected procedure Update; procedure Execute; override; end; var Form1: TForm1; MyThread: TMyThread; implementation {$R *.dfm} procedure TMyThread.Execute; begin Synchronize(Update); end; procedure TMyThread.Update; var i:integer; s1, s2: TStringList; begin s1 := TStringList.Create; s1.LoadFromFile('dup.txt'); s2 := TStringList.Create; s2.Sorted := True; s2.Duplicates := dupIgnore; s2.BeginUpdate; for i :=0 to s1.Count-1 do s2.add(s1[i]); s2.EndUpdate; s2.SaveToFile('nodup.txt'); s1.Free; s2.Free; Showmessage('True'); end; procedure TForm1.Button1Click(Sender: TObject); begin MyThread:=TMyThread.Create(false); MyThread.Priority:=tpNormal; end; end. Работает только такое ощущение что опять в один поток уж как то долго. Вариант без синхронизации тоже долгий ! Edited February 14, 2016 by noveek Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,212 #313657 Posted February 14, 2016 (edited) Работает только такое ощущение что опять в один поток уж как то долго. Вариант без синхронизации тоже долгий Конечно, так и должно быть. Ведь у вас в программе нет ни какого распараллеливания операций, которое могло бы ускорить работу вашей программы )))) Кхе-кхе, вы вообще представляете хотя бы в общих чертах как работает код вашей программы что приведен выше? Вы в коде делаете операцию переноса записей из одного списка в другой. Нет ни какой разницы будет ли это делаться в главном потоке самой программы или это будет делаться в дочернем потоке MyThread. Время на это уйдет одинаковое. Если вам не понятно, поясню на пальцах, представьте что нужно выкопать яму, вы - главный поток, ваш друг - дочерний поток. Если вы один копаете вам нужно 2 часа. Если ваш друг тоже один капает, то ему тоже нужно как и вам 2 часа. Таким образом, не важно кто из вас двоих будет делать эту работу, все равно 2 часа. А вот чтобы быстрее яма выкапывалась надо чтобы вы вдвоем её копали одновременно. В вашем случае сделать этого нельзя, так как в вашем коде нет возможности что-либо делать параллельно. Edited February 14, 2016 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
noveek 27 #313659 Posted February 14, 2016 (edited) Конечно, так и должно быть. Ведь у вас в программе нет ни какого распараллеливания операций, которое могло бы ускорить работу вашей программы )))) Кхе-кхе, вы вообще представляете хотя бы в общих чертах как работает код вашей программы что приведен выше? Вы в коде делаете операцию переноса записей из одного списка в другой. Нет ни какой разницы будет ли это делаться в главном потоке самой программы или это будет делаться в дочернем потоке MyThread. Время на это уйдет одинаковое. Если вам не понятно, поясню на пальцах, представьте что нужно выкопать яму, вы - главный поток, ваш друг - дочерний поток. Если вы один копаете вам нужно 2 часа. Если ваш друг тоже один капает, то ему тоже нужно как и вам 2 часа. Таким образом, не важно кто из вас двоих будет делать эту работу, все равно 2 часа. А вот чтобы быстрее яма выкапывалась надо чтобы вы вдвоем её копали одновременно. В вашем случае сделать этого нельзя, так как в вашем коде нет возможности что-либо делать параллельно. Нет моя другая программа с потоком составления листа Login:pass работает быстро ! На 5 млн записей уходит 2-3 минуты ты наверное сам путаешь с чем то потоки Edited February 14, 2016 by noveek Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #313660 Posted February 14, 2016 На 5 млн записей уходит 2-3 минутыэто быстро? Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,212 #313662 Posted February 14, 2016 Нет моя другая программа с потоком составления листа Login:pass работает быстро ! На 5 млн записей уходит 2-3 минуты ты наверное сам путаешь с чем то потоки Причем тут другая программа, если мы обсуждаем код приведенный выше? Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,212 #313696 Posted February 15, 2016 ты наверное сам путаешь с чем то потоки Вы бестолковый агрошкольник, да? 2 Quote Share this post Link to post Short link Share on other sites