delphi 线程

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值