以前写过写多线程,往往是一个死循环中采用sleep来把释放cpu的时间片,这几天写了个基于Event通知的线程,应用起来还不错,就帖上来,希望大家多多指教.
//------------------------------------------
// 处理数据线程父类,实现方法由子类完成
//------------------------------------------
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
constructorcreate(AManager: TManager);
destructor destroy; override;
procedure execute; override;
procedure WriteData(var ABuffer; ASize:DWORD); virtual ;
end;
//视频数据处理线程
TVideoPlayThread =class(TPlayThread)
private
procedure play; override;
end;
//音频数据处理线程
TAudioPlayThread = class(TPlayThread)
private
procedure play; override;
end;
//礼物数据处理线程
TPresentPlayThread = class(TPlayThread)
private
CHAT_Present: TCHAT_Present;
function ReadData: Boolean; override;
procedure play; override;
public
procedure WriteData(varABuffer; Asize: DWORD); override;
end;
implementation
//以下为功能实现部分
{ TPlayThread }
procedureTPlayThread.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;
inheritedCreate(false);
责任编辑:小草