Delphi线程类(二)

ContractedBlock.gif ExpandedBlockStart.gif View Code
 
   
{ ******************************************************* }
{ }
{ Delphi Thread Sample 2 }
{ Creation Date 2011.06.30 }
{ Created By: ming }
{ }
{ ******************************************************* }
unit unitWorkThread;

interface

uses
Classes,Windows, Messages, SysUtils, Graphics, StdCtrls;

type
TWorkThread
= class (TThread)
private
{ Private declarations }
FEvent: HWND;
FMsg:
string ;
FMemo: TMemo;
FInterval: Cardinal;
procedure doSyncProc1;
procedure doSomething;
procedure syncOutputMsg;
procedure doOutputMsg( const msg: string );
procedure _sleep(millisecond:Cardinal);
protected
procedure Execute; override ;
public
constructor Create(Suspend: boolean); overload ;
constructor Create(Suspend: boolean; mmoOutput: TMemo); overload ;
destructor Destroy; override ;
public
procedure exitThread;
public
property Interval:Cardinal read FInterval write FInterval;
end ;

var
WorkThread: TWorkThread;
const
WM_TEST1
= WM_USER + 1000 ; // range (WM_USER - $7FFF)
WM_TEST2
= WM_APP + 100 ; // range (WM_APP - $BFFF)

implementation

{ TWorkThread }

constructor TWorkThread.Create(Suspend: boolean);
begin
inherited Create(Suspend);
FEvent :
= CreateEvent( nil ,False,False, nil );
FreeOnTerminate :
= True;
FInterval :
= 100 ;
end ;

constructor TWorkThread.Create(Suspend: boolean; mmoOutput: TMemo);
begin
inherited Create(Suspend);
FEvent :
= CreateEvent( nil ,False,False, nil );
FreeOnTerminate :
= True;
FInterval :
= 100 ;
FMemo :
= mmoOutput;
doOutputMsg(
' Thread Create ' );
end ;

destructor TWorkThread.Destroy;
begin
CloseHandle(FEvent);
doOutputMsg(
' Thread Destroy ' );
inherited ;
end ;

procedure TWorkThread.doSyncProc1;
begin

end ;

procedure TWorkThread.doOutputMsg( const msg: string );
begin
FMsg :
= msg;
Synchronize(syncOutputMsg);
end ;

procedure TWorkThread.syncOutputMsg;
begin
if Assigned(FMemo) then
FMemo.Lines.Add(FMsg);
end ;

procedure TWorkThread.doSomething;
begin
// Synchronize(doSyncProc1);
doOutputMsg(FormatDateTime(
' HH:NN:SS ' ,now));
end ;

{
GetMessage 阻塞模式类似于SendMessage
PeekMessage 非阻塞模式类似于PostMessage
}
{ .$DEFINE _BLOCKMSG }
procedure TWorkThread.Execute;
var
aMsg: TMsg;
begin
inherited ;
{ $IFDEF _BLOCKMSG }
while GetMessage(aMsg, 0 , 0 , 0 ) do
begin
case aMsg. message of
WM_QUIT:
begin
Break;
end ;
WM_TEST1:
begin
doOutputMsg(
' Received Msg1 ' );
doSomething;
end ;
WM_TEST2:
begin
doOutputMsg(
' Received Msg2 ' );
doSomething;
end ;
end ;
end ;
{ $ELSE }
while not Terminated do
begin
if PeekMessage(aMsg, 0 , 0 , 0 ,PM_REMOVE) then
begin
case aMsg. message of
WM_QUIT:
begin
Break;
end ;
WM_TEST1:
begin
doOutputMsg(
' Received Msg1 ' );
end ;
WM_TEST2:
begin
doOutputMsg(
' Received Msg2 ' );
end ;
end ;
end ;
doSomething;
_sleep(FInterval);
end ;
{ $ENDIF }
end ;

procedure TWorkThread.exitThread;
begin
PostThreadMessage(Self.ThreadID,WM_QUIT,
0 , 0 );
if Suspended then Resume;
end ;

procedure TWorkThread._sleep(millisecond: Cardinal);
begin
WaitForSingleObject(Self.Handle,millisecond);
end ;

{ ============================================================= }
{ uses unitWorkThread;

procedure TForm1.btnCreateThreadClick(Sender: TObject);
begin
if Assigned(WorkThread) then exit;
WorkThread := TWorkThread.Create(False,mmoOutput);
WorkThread.Interval := 1000;
if WorkThread.Suspended then
WorkThread.Resume;
end;

procedure TForm1.btnDestroyThreadClick(Sender: TObject);
begin
if Assigned(WorkThread) then
begin
WorkThread.exitThread;
WorkThread := nil;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if Assigned(WorkThread) then
PostThreadMessage(WorkThread.ThreadID,WM_TEST1,0,0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if Assigned(WorkThread) then
PostThreadMessage(WorkThread.ThreadID,WM_TEST2,0,0);
end;
}

end .

转载于:https://www.cnblogs.com/Jekhn/archive/2011/06/30/2094190.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值