Delphi:线程在excute模块

时间:2015-11-25 10:05:25

标签: delphi thread-safety

我是DELPHI的初学者。 我必须开发一个基于线程的应用程序。 如何在线程执行函数中挂起线程,而不是在UI线程.... 请给我样品

3 个答案:

答案 0 :(得分:1)

暂停暂停线程。例如,您可以睡眠指定的时间。或者您可以等待同步对象。例如,您可能会等待某个事件。当另一个线程发出该事件的信号时,暂停的线程将恢复。

答案 1 :(得分:1)

假设您正在使用Windows平台...

有许多方法可以暂停线程。使用哪一个很大程度上取决于它应该恢复的时间/原因,以及该线程是否有消息队列。

如果需要长时间挂起线程,关于消息队列的要点尤为重要。任何没有处理Windows消息的线程都可以挂起许多操作,DDE通信,消息广播等。合同是"如果你的线程有一个消息队列,它需要对它们进行处理。",它需要做所以及时。在这种情况下,我建议从线程中调用MsgWaitForMultipleObjects。即使您没有等待任何对象,该功能也可以工作,这样您就可以等待消息并超时。 WaitMessage也可以工作,但它没有超时,除了其他含义之外,你需要在终止它之后向线程发送消息,否则,它可能永远不会终止。

如果线程没有消息队列,那么有很多选项。如果您想等待特定的时间,Sleep是有效的。如果您想等待特定事件恢复该线程,TEvent类可能就是您要查找的内容。

如果没有更多细节,很难给出确定的答案。

答案 2 :(得分:-1)

此示例运行正常。通过使用线程,非常小心。这是一个非常困难的部分。

unit Unit1;

interface

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

type
  TMyThread=class(tthread)
  FEvent:THandle;
  private
  procedure SetText;
  protected
  procedure Execute;override;
  public
  constructor Create(CreateSuspended:Boolean=false);
  destructor Destroy; override;
  procedure Start;
  procedure Stop;
  procedure StopAndTerminate;
  end;

type
  TForm1 = class(TForm)
    OutMem: TMemo;
    BtnStart: TButton;
    BtnStop: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure BtnStartClick(Sender: TObject);
    procedure BtnStopClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  mythread:tmythread;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  mythread:=tmythread.Create();
end;

{ TMyThread }

constructor TMyThread.Create(CreateSuspended: Boolean);
begin
  Inherited Create(CreateSuspended);
  FEvent:=CreateEvent(nil,true,false,pchar(inttostr(handle)));
end;

destructor TMyThread.Destroy;
begin
  CloseHandle(FEVENT);
  inherited;
end;

procedure TMyThread.Execute;
begin
  while not terminated do
  begin
    WaitForSingleObject(FEvent,INFINITE);
    if terminated then exit;
    Synchronize(SetText);
    { Methods and properties of objects in visual components (forms, buttons, memo and other)
     can only be used in a method called using Synchronize}
 end;

end;

procedure TMyThread.SetText;
begin
  form1.OutMem.Lines.Append(inttostr(gettickcount));
  application.ProcessMessages;
  // Application.ProcessMessages method must be call ONLY in MainThread.
  // by using Synchronize, SetText procedure will be run in MainThread.
end;

procedure TMyThread.Start;
begin
  SetEvent(FEVENT);
end;

procedure TMyThread.Stop;
begin
  ResetEvent(FEVENT);
end;

procedure TMyThread.StopAndTerminate;
begin
  Terminate;
  PulseEvent(FEVENT);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  mythread.StopAndTerminate;
  mythread.WaitFor;
  mythread.Free;
end;

procedure TForm1.BtnStartClick(Sender: TObject);
begin
  mythread.Start;
end;

procedure TForm1.BtnStopClick(Sender: TObject);
begin
  mythread.Stop;
end;

end.