Jump to content
Korean Random
noveek

Delphi в чём моя ошибка ?

Recommended Posts

Не понимаю почему отказывается удалять дубликаты строк в потоке хотя строки всё таки пересортировывает нормально ! Подскажите что делаю не правильно ?

 

 

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.

Share this post


Link to post

Short link
Share on other sites

Наверное должно быть s2.Duplicates := dupIgnore;

Нет ! И дело не в этом S2 лишь добавляет в свой лист уже отсортированные и без дубликатов S1

Share this post


Link to post

Short link
Share on other sites

Ну попробуй сам сначала

Зачем мне пробовать?

устанавливать свойства объекта нужно до работы с его методами.

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 by ShadowHunterRUS

Share this post


Link to post

Short link
Share on other sites

Зачем мне пробовать?

устанавливать свойства объекта нужно до работы с его методами.

 

Главное в твоём коде весь смысл многопоточности приложения теряется =)

Edited by noveek

Share this post


Link to post

Short link
Share on other sites

S1 и S2 должны быть локальными переменными класса-потока. Только в этом случае результат будет ожидаемым. Если же это переменные вне класса, то для работы с ними придется использовать синхронизацию.

procedure MyThread.Update;
begin
  ....
end;

procedure MyThread.Execute;
begin
  Synchronize(Update);
end;

И конечно же в этом случае паралльеной работы потока с главной нитью не происходит. По этой причине вам лучше сделать списки локальными внутри класса-потока, а инфу в них передать либо переопределив Create класса-потока, либо создав свойства у класса-потока и присвоив им значения до вызова Execute.


Также при работе с TStringsList следует использовать BeginUpdate и EndUpdate это существенно ускорит обработку инфы внутри них.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

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.

Share this post


Link to post

Short link
Share on other sites

s1.Duplicates := dupIgnore;

вы не тупите, а прочитайте доки.

это свойство нужно задавать для s2 всего 1 раз, а не для s1 еще и в цикле.

Edited by ShadowHunterRUS

Share this post


Link to post

Short link
Share on other sites

Зачем вы применяете синхронизацию если у вас локальные переменные? А где у вас уничтожение списков? Ну и настройку не правильно делаете.

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 by StranikS_Scan
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

вы не тупите, а прочитайте доки.

это свойство нужно задавать для 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 by noveek

Share this post


Link to post

Short link
Share on other sites
Работает только такое ощущение что опять в один поток уж как то долго. Вариант без синхронизации тоже долгий

 

Конечно, так и должно быть. Ведь у вас в программе нет ни какого распараллеливания операций, которое могло бы ускорить работу вашей программы ))))

 

Кхе-кхе, вы вообще представляете хотя бы в общих чертах как работает код вашей программы что приведен выше? Вы в коде делаете операцию переноса записей из одного списка в другой. Нет ни какой разницы будет ли это делаться в главном потоке самой программы или это будет делаться в дочернем потоке MyThread. Время на это уйдет одинаковое.

 

Если вам не понятно, поясню на пальцах, представьте что нужно выкопать яму, вы - главный поток, ваш друг - дочерний поток. Если вы один копаете вам нужно 2 часа. Если ваш друг тоже один капает, то ему тоже нужно как и вам 2 часа. Таким образом, не важно кто из вас двоих будет делать эту работу, все равно 2 часа. А вот чтобы быстрее яма выкапывалась надо чтобы вы вдвоем её копали одновременно.

 

В вашем случае сделать этого нельзя, так как в вашем коде нет возможности что-либо делать параллельно.

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

Конечно, так и должно быть. Ведь у вас в программе нет ни какого распараллеливания операций, которое могло бы ускорить работу вашей программы ))))

 

Кхе-кхе, вы вообще представляете хотя бы в общих чертах как работает код вашей программы что приведен выше? Вы в коде делаете операцию переноса записей из одного списка в другой. Нет ни какой разницы будет ли это делаться в главном потоке самой программы или это будет делаться в дочернем потоке MyThread. Время на это уйдет одинаковое.

 

Если вам не понятно, поясню на пальцах, представьте что нужно выкопать яму, вы - главный поток, ваш друг - дочерний поток. Если вы один копаете вам нужно 2 часа. Если ваш друг тоже один капает, то ему тоже нужно как и вам 2 часа. Таким образом, не важно кто из вас двоих будет делать эту работу, все равно 2 часа. А вот чтобы быстрее яма выкапывалась надо чтобы вы вдвоем её копали одновременно.

 

В вашем случае сделать этого нельзя, так как в вашем коде нет возможности что-либо делать параллельно.

 

Нет моя другая программа с потоком составления листа Login:pass работает быстро ! На 5 млн записей уходит 2-3 минуты ты наверное сам путаешь с чем то потоки

Edited by noveek

Share this post


Link to post

Short link
Share on other sites

Нет моя другая программа с потоком составления листа Login:pass работает быстро ! На 5 млн записей уходит 2-3 минуты ты наверное сам путаешь с чем то потоки

 

Причем тут другая программа, если мы обсуждаем код приведенный выше?

Share this post


Link to post

Short link
Share on other sites

 

 

ты наверное сам путаешь с чем то потоки

 

Вы бестолковый агрошкольник, да? 

  • Downvote 2

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...