Показать сообщение отдельно
  #12  
Старый 14.10.2010, 20:45
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

1.
Код:
unit Unit1;

interface

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

type

  TMyThread = class(TThread)
  private
    str: String;
  protected
    procedure Execute; override;
    procedure Updt;
  public
    constructor Create;
    destructor Destroy; override;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
    FMyThread: TMyThread;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMyThread }

constructor TMyThread.Create;
begin
  FreeOnTerminate:=True;
  inherited Create(False);
end;

destructor TMyThread.Destroy;
begin
  Form1.FMyThread:=nil;
  inherited Destroy;
end;

procedure TMyThread.Execute;
begin
  str:='begin';
  // в Label1 записываем текст в синхронизированом вызове Updt
  Synchronize(Updt);
  // крутим цикл пока не послан сигнал Terminate
  while not Terminated do
  begin
    Sleep(100);
    str:=IntToStr(GetTickCount div 100);
    // в Label1 записываем текст в синхронизированом вызове Updt
    Synchronize(Updt);
  end;
  str:='end';
  // в Label1 записываем текст в синхронизированом вызове Updt
  Synchronize(Updt);
end;

procedure TMyThread.Updt;
begin
  // этот метод вызывается в основном потоке VLC 
  // в Label1 записываем текст
  Form1.Label1.Caption:=str;
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  // создаем поток
  if not Assigned(FMyThread) then FMyThread:=TMyThread.Create;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  // приостанавливаем выполнение
  if Assigned(FMyThread) then FMyThread.Suspend;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  // возобновляем выполнение
  if Assigned(FMyThread) then FMyThread.Resume;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  // прерываем выполнение
  if Assigned(FMyThread) then FMyThread.Terminate;
end;

end.

2. грубо читать данные из TMemo (и вообще любого другого если пользователь во время работы не изменяет данные) можно и не в Synchronize, но писать лучше в Synchronize. тут проблема еще в отображении может быть. например windows отрисовывает progressbar, когда поток в нем меняет что-то, на экране может смотреться не красиво.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием