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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2010, 22:02   #1
edmynt
Пользователь
 
Аватар для edmynt
 
Регистрация: 03.06.2009
Сообщений: 83
По умолчанию Передача имени объекта в процедуру (Потоки) Delphi

Собственно создавать потоки я научился. И решил попробывать создать несколько потоков из одной процедуры. Потоки у меня - это счетчик значений которые выводяться в компоненты Edit1 и Edit2
Проблема в том, что немагу в процедуру потока передать имя объекта TEdit.

Код:
unit Unit3;

interface

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

type
  TForm3 = class(TForm)
    RichEdit1: TRichEdit;
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  potok = class(TThread)
    private
    { Private declarations }
       index:integer;
    protected
     Procedure execute; override;
  end;
var
  Form3: TForm3;
  p:potok;

implementation

Procedure potok.execute(T:PChar);
begin
    index:=1;

  while index>0 do
    begin
    FreeOnTerminate:= True;
      SendMessage (Form3.T.Handle,WM_SETTEXT,0,
                integer(PChar(IntToStr(index))));
       inc(index);
       if terminated then
        exit;
    end;
end;
{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
begin
potok.execute(Edit2);
   p:=Potok.Create(True);
   p.Resume;
   p.Priority:=TpLower;
end;

procedure TForm3.Button2Click(Sender: TObject);
begin
  p.Terminate;
end;

end.
edmynt вне форума Ответить с цитированием
Старый 02.02.2010, 23:28   #2
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Обращаться к компонентам из вторичного (т.е. не главного VCL потока) не рекомендуется. Обычное делается так, что нужная работа выносится в поток, а обновление интерфейса происходит по таймеру (компонент TTimer), вот как здесь:

Код:
unit fThreadExample;

interface

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

type
  TMyThread = class;

  TfrmThreadExample = class(TForm)
    edValue: TEdit;
    tmUpdate: TTimer;
    btnStart: TButton;
    btnStop: TButton;
    procedure btnStartClick(Sender: TObject);
    procedure btnStopClick(Sender: TObject);
    procedure tmUpdateTimer(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    FThread : TMyThread;
  public
    { Public declarations }
  end;

  TMyThread = class(TThread)
  private
    FIndex : Integer;
  protected
    procedure Execute; override;
  public
    property Index : Integer read FIndex;
  end;

var
  frmThreadExample: TfrmThreadExample;

implementation

{$R *.dfm}

{ TMyThread }

procedure TMyThread.Execute;
begin
  while not Terminated do
  begin
    Inc( FIndex );
    Sleep( 0 ); { чтобы не сильно грузил приложение }
  end;
end;

procedure TfrmThreadExample.btnStartClick(Sender: TObject);
begin
  FThread := TMyThread.Create( False );
  btnStart.Enabled := False;
  tmUpdate.Enabled := True;
end;

procedure TfrmThreadExample.btnStopClick(Sender: TObject);
begin
  tmUpdate.Enabled := False;
  if Assigned( FThread ) then
    begin
      { останавливаем поток и дожидаемся его завершения }
      FThread.Terminate;
      FThread.WaitFor;
      FreeAndNil( FThread );
    end;
  btnStart.Enabled := True;
end;

procedure TfrmThreadExample.FormDestroy(Sender: TObject);
begin
  if Assigned( FThread ) then
    begin
      FThread.Terminate;
      FThread.WaitFor;
    end;
  FreeAndNil( FThread );
end;

procedure TfrmThreadExample.tmUpdateTimer(Sender: TObject);
begin
  if Assigned( FThread ) then
    edValue.Text := IntToStr( FThread.Index );
end;

end.
Вложения
Тип файла: rar ThreadExample.rar (2.6 Кб, 16 просмотров)
maxionans вне форума Ответить с цитированием
Старый 03.02.2010, 13:40   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Обычное делается так
вообще то ддля такого придумана синхронизация
вот пример:
Главный модуль:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    CheckBox1: TCheckBox;
    procedure CheckBox1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var   t:tt;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
 if CheckBox1.Checked then begin
  t:=tt.Create(true);
  t.e:=Edit1;
  t.ch:=CheckBox1;
  t.FreeOnTerminate:=true;
  t.Resume;
 end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 t.Terminate;
end;

end.
модуль потока:
Код:
unit Unit2;

interface

uses
  Classes,StdCtrls,SysUtils;

type
  tt = class(TThread)
  public          
   e:TEdit;ch:TCheckBox;
  private     b:boolean;
    { Private declarations }
  protected
    procedure Execute; override;
    procedure UpdateCaption;
  end;

implementation


{ tt }

procedure tt.Execute;
begin         b:=true;
  while b do UpdateCaption;
  { Place thread code here }
end;

procedure tt.UpdateCaption;
begin
 if e<>nil then e.Text:=TimeToStr(now);
 if ch<>nil then b:=ch.Checked;
end;

end.
И никаких проблем. Единственное что поток при закрытии останавливать корректно нужно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.02.2010, 20:58   #4
edmynt
Пользователь
 
Аватар для edmynt
 
Регистрация: 03.06.2009
Сообщений: 83
По умолчанию

Спасибо,кажется начинаю понимать
edmynt вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки, передача файлов по сети SeЯgey Работа с сетью в Delphi 3 02.04.2011 23:51
Передача поля объекта в процедуру в качестве параметра Голованов Д. Microsoft Office Excel 10 02.11.2009 16:22
Задание имени объекта процедурке Alex Cones Общие вопросы Delphi 4 24.05.2009 12:05
Передача имени класса как параметра Квэнди Общие вопросы Delphi 14 06.04.2009 20:09
передача массива в процедуру Gash Общие вопросы Delphi 1 01.02.2009 00:30