Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2012, 12:07   #1
ThreadDelphi
Новичок
Джуниор
 
Регистрация: 08.04.2012
Сообщений: 2
Радость Работа с потоками

Нужно, чтобы memo заполнялось числами с помощью n-го количества потоков. Числа заполняются, только вот потоки некоректно работают (скорость остается такой же, как и без использования потоков). Подскажите, пожалуйста, где косяк.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, SyncObjs;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }

  public
    { Public declarations }
  end;

  
  TNewThread=class(TThread)
  private
   procedure UpdateMemo;
  protected
    procedure Execute; override;
  public
    constructor Create(CreateSuspended: Boolean);
    end;

var
  Form1: TForm1;
  x,y,Thread:integer;
  Work:boolean;
  cs:TCriticalSection;

implementation

{$R *.dfm}

constructor TNewThread.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  x:=-1;
  Work:=true;
  for Thread:=1 to strtoint(Edit1.Text) do
    TNewThread.Create(false);
  Thread:=strtoint(Edit1.Text);
end;

procedure TNewThread.Execute;
begin
  while Work do
    begin
      cs.enter;
      inc(x);
      if x<1000 then y:=x else work:=false;
      cs.leave;
      if work then
      Synchronize(UpdateMemo);
    end;
  dec(thread);
end;

procedure TNewThread.UpdateMemo;
begin
 Form1.Memo1.Lines.Add(inttostr(y));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  cs:=TCriticalSection.create;
end;

end.
ThreadDelphi вне форума Ответить с цитированием
Старый 08.04.2012, 13:19   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А какой прирост скорости ты ожидаешь?
Ты же заставляешь перерисовываться визуальный компонент в нескольких потоках, откуда здесь скорость?

А вот если попробуешь сделать что-то вроде такого:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormTerm(Sender: TObject);
  private
    { Private declarations }
    
  public      tl:TThreadList;
    { Public declarations }
  end;

TNewThread=class(TThread)
  private
   procedure UpdateMemo;
   procedure redelme;
  protected
    procedure Execute; override;
  public
    MyName:String;
end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TNewThread }


procedure TNewThread.Execute;  var i:integer;
begin
  inherited;
  for i:=0 to 1000 do Synchronize(UpdateMemo);
  Synchronize(redelme);
end;

procedure TNewThread.redelme;
begin
  form1.tl.Remove(self);
end;

procedure TNewThread.UpdateMemo;
begin
 with  Form1.Memo1.Lines do begin
   Add(DateTimeToStr(now)+' '+self.Myname);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;  t:TNewThread;
begin
 Memo1.Lines.BeginUpdate;
 tl:=TThreadList.Create;
 for i:=1 to 10 do begin
   t:=TNewThread.Create(true);tl.Add(t);
   with t do begin
     FreeOnTerminate:=true;
     MyName:='Thread_'+IntToStr(i);
     OnTerminate:=FormTerm;
     Resume;
   end;
 end;
end;

procedure TForm1.FormTerm(Sender: TObject);
var l:TList;
begin
 l:=tl.LockList;
 if l.Count=0 then Memo1.Lines.EndUpdate;
 tl.UnlockList;
end;

end.
То заметишь прирост скорости.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.04.2012, 13:43   #3
ThreadDelphi
Новичок
Джуниор
 
Регистрация: 08.04.2012
Сообщений: 2
По умолчанию

Спасибо большое
ThreadDelphi вне форума Ответить с цитированием
Старый 08.04.2012, 18:58   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Наздоровье )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с потоками MetR Помощь студентам 1 04.12.2011 01:32
работа с потоками SHtirlic1 Общие вопросы Delphi 10 15.03.2011 20:03
Работа с потоками Яр|/||< (^_^) Общие вопросы Delphi 5 09.03.2010 08:23
Работа с потоками den49 Помощь студентам 0 06.10.2009 14:52
работа с потоками Alex_Pro Общие вопросы .NET 1 01.07.2008 07:25