delphi中基于事件通知的多線程應(yīng)用

字號(hào):

以前寫過寫多線程,往往是一個(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);