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