DELPHI中多线程改进后的代码,长工作型
主程序
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,Unit2, StdCtrls;
type
TForm1 = class(TForm)
btn_SetTask: TButton;
btn_CreateTrd: TButton;
btn_ExitThd: TButton;
procedure btn_SetTaskClick(Sender: TObject);
procedure btn_CreateTrdClick(Sender: TObject);
procedure btn_ExitThdClick(Sender: TObject);
private
LongWaitThread:TLongWaitTrd;
procedure OnThreadMessage(var Message: TMessage); message WM_USER+2000;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btn_SetTaskClick(Sender: TObject);
begin
if (LongWaitThread<>nil) then
PostThreadMessage(LongWaitThread.ThreadID,WM_USER+1000,0,0);
end;
procedure TForm1.btn_CreateTrdClick(Sender: TObject);
begin
LongWaitThread:=TLongWaitTrd.Create(true);
LongWaitThread.MainWin:=Handle;
LongWaitThread.Resume;
end;
procedure TForm1.OnThreadMessage(var Message: TMessage);
begin
if Message.Msg= WM_USER+2000 then
begin
Showmessage(String(message.LParam));
end;
end;
procedure TForm1.btn_ExitThdClick(Sender: TObject);
begin
if (LongWaitThread<>nil) then
begin
if (not LongWaitThread.ExitLongWaitTrd()) then
ShowMessage('The thread exited time out');
LongWaitThread.Free;
end;
end;
线程类 unit Unit2;
interface
uses
Classes,Windows,Messages,SyncObjs;
type
TLongWaitTrd = class(TThread)
private
FMainWin:THandle;
QuitEvent: TEvent;
procedure SendFeedBackToMainWin();
procedure DoTheHardWork();
protected
procedure Execute; override;
public
constructor Create(CreateSuspended: Boolean);
destructor Destroy; override;
function ExitLongWaitTrd():Boolean;
published
property MainWin:THandle read FMainWin write FMainWin;
end;
implementation
uses Unit1;
constructor TLongWaitTrd.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
end;
destructor TLongWaitTrd.Destroy;
begin
inherited;
end;
procedure TLongWaitTrd.DoTheHardWork();
begin
//to do
end;
procedure TLongWaitTrd.Execute;
var
Msg: TMsg;
begin
while true do
begin
if getmessage(msg,0,0,0) then
begin
if Msg.message=WM_USER+1000 then
begin
DoTheHardWork();
end;
end else
begin
if Msg.message=WM_QUIT then
begin
QuitEvent.SetEvent;
break;
end;
end;
end;
Terminate;
end;
function TLongWaitTrd.ExitLongWaitTrd():Boolean;
begin
result:=true;
QuitEvent:=TEvent.Create(nil,True,False,'QuitEvent');
PostThreadMessage(ThreadID,WM_QUIT,0,0);
if (QuitEvent.WaitFor(2000)=wrTimeOut) then
Result:=false;
QuitEvent.Free;
end;
procedure TLongWaitTrd.SendFeedBackToMainWin();
var
Status:String;
begin
if (MainWin<>0) then
begin
Status:='The data has been processed by thread.';
SendMessage(MainWin,WM_USER+2000,0,Integer(PChar(Status)));
end;
end;
end.
参考文章: http://bbs.youkuaiyun.com/topics/360046056?page=1