以前寫過寫多線程,往往是一個(gè)死循環(huán)中采用sleep來把釋放cpu的時(shí)間片 ,這幾天寫了個(gè)基于Event通知的線程,應(yīng)用起來還不錯(cuò),就帖上來,希望大家多多指教,見笑了.
//------------------------------------------
// 處理數(shù)據(jù)線程父類,實(shí)現(xiàn)方法由子類完成
// Add by hua 2007/08/07
//------------------------------------------
TPlayThread = class(TThread)
private
HEvent: THandle;
CS_Memory: TRTLCriticalSection ;
FData: array of byte;
FManager: TManager;
FMemory: TMemoryStream ;
FReadPos: integer;
procedure play; virtual;abstract;
function ReadData: Boolean; virtual ;
procedure ClearData;
public
constructor create(AManager: TManager);
destructor destroy; override;
procedure execute; override;
procedure WriteData(var ABuffer; ASize: DWORD); virtual ;
end;
//視頻數(shù)據(jù)處理線程
TVideoPlayThread = class(TPlayThread)
private
procedure play; override;
end;
//音頻數(shù)據(jù)處理線程
TAudioPlayThread = class(TPlayThread)
private
procedure play; override;
end;
//禮物數(shù)據(jù)處理線程
TPresentPlayThread = class(TPlayThread)
private
CHAT_Present: TCHAT_Present;
function ReadData: Boolean; override;
procedure play; override;
public
procedure WriteData(var ABuffer; Asize: DWORD); override;
end;
implementation
//以下為功能實(shí)現(xiàn)部分
{ TPlayThread }
procedure TPlayThread.ClearData;
begin
FReadPos := 0;
FMemory.Clear;
end;
constructor TPlayThread.create(AManager: TManager);
begin
InitializeCriticalSection(CS_Memory);
HEvent := CreateEvent(nil, False, False, nil);
FManager := AManager;
FMemory := TMemoryStream.Create;
FreeOnTerminate := true;
inherited Create(false);
//------------------------------------------
// 處理數(shù)據(jù)線程父類,實(shí)現(xiàn)方法由子類完成
// Add by hua 2007/08/07
//------------------------------------------
TPlayThread = class(TThread)
private
HEvent: THandle;
CS_Memory: TRTLCriticalSection ;
FData: array of byte;
FManager: TManager;
FMemory: TMemoryStream ;
FReadPos: integer;
procedure play; virtual;abstract;
function ReadData: Boolean; virtual ;
procedure ClearData;
public
constructor create(AManager: TManager);
destructor destroy; override;
procedure execute; override;
procedure WriteData(var ABuffer; ASize: DWORD); virtual ;
end;
//視頻數(shù)據(jù)處理線程
TVideoPlayThread = class(TPlayThread)
private
procedure play; override;
end;
//音頻數(shù)據(jù)處理線程
TAudioPlayThread = class(TPlayThread)
private
procedure play; override;
end;
//禮物數(shù)據(jù)處理線程
TPresentPlayThread = class(TPlayThread)
private
CHAT_Present: TCHAT_Present;
function ReadData: Boolean; override;
procedure play; override;
public
procedure WriteData(var ABuffer; Asize: DWORD); override;
end;
implementation
//以下為功能實(shí)現(xiàn)部分
{ TPlayThread }
procedure TPlayThread.ClearData;
begin
FReadPos := 0;
FMemory.Clear;
end;
constructor TPlayThread.create(AManager: TManager);
begin
InitializeCriticalSection(CS_Memory);
HEvent := CreateEvent(nil, False, False, nil);
FManager := AManager;
FMemory := TMemoryStream.Create;
FreeOnTerminate := true;
inherited Create(false);