zoukankan      html  css  js  c++  java
  • delphi 线程使用

    unit untWorkThread;

    interface

    uses
      Windows,Classes,SysUtils;

    type
      TWorkItem=class
      end;
      TProcessWork=procedure (Sender:TObject;Work:TWorkItem) of Object;
      TWorkThread=class(TThread)
      private
        FCriticalSection:TRTLCriticalSection;
        hEvent:Cardinal;
        FList:TList;
        FProcessWork:TProcessWork;
        procedure ProcessWork(Work:TWorkItem);
        function GetWork(var AWork:TWorkItem):Boolean;
      protected
        procedure Execute;override;
      public
        procedure AddWork(AWork:TWorkItem);
        constructor Create;
        destructor Destroy; override;
        property OnProcessWork:TProcessWork read FProcessWork write FProcessWork;
      end;

    implementation

    {TWorkThread}

    constructor TWorkThread.Create;
    begin
      InitializeCriticalSection(FCriticalSection);
      hEvent:=CreateEvent(nil,False,False,nil);
      FList:=TList.Create;
      Self.FreeOnTerminate:=False;
      inherited Create(False);
    end;

    destructor TWorkThread.Destroy;
    var
      i:Integer;
    begin
      for i:=FList.Count-1 downto 0 do TWorkItem(FList.Items[i]).Free;
      DeleteCriticalSection(FCriticalSection);
      FList.Free;
      CloseHandle(hEvent);
    end;

    function TWorkThread.GetWork(var AWork:TWorkItem):Boolean;
    begin
      Result:=False;
      EnterCriticalSection(FCriticalSection);
      try
        if FList.Count>0 then
        begin
          AWork:=TWorkItem(FList.Items[0]);
          FList.Delete(0);
          Result:=True;
        end;
      finally
        LeaveCriticalSection(FCriticalSection);
      end;
    end;

    procedure TWorkThread.Execute;
    var
      Work:TWorkItem;
    begin
      while not Self.Terminated do
      begin
        WaitForSingleObject(hEvent,INFINITE);
        while GetWork(Work) do
        begin
          ProcessWork(Work);
          Work.Free;
        end;
      end;
    end;

    procedure TWorkThread.ProcessWork(Work:TWorkItem);
    begin
      if Assigned(FProcessWork) then FProcessWork(Self,Work);
    end;

    procedure TWorkThread.AddWork(AWork:TWorkItem);
    begin
      EnterCriticalSection(FCriticalSection);
      try
        FList.Add(AWork);
      finally
        LeaveCriticalSection(FCriticalSection);
      end;
      SetEvent(hEvent);
    end;

    end.
  • 相关阅读:
    机器学习入门之二:一个故事说明什么是机器学习(转载)
    机器学习入门之一:背景介绍(转载)
    python 读取CSV文件 中文乱码
    如何快速学习一门新技术(转载)
    Oracle12c多租户如何启动关闭CDB或PDB (PDB自动启动)
    oracle单实例12.2.0.1安装
    PRVF-0002 : could not retrieve local node name
    图形化升级单机oracle 11.2.0.4 到 12.2.0.1
    ORA-00845: MEMORY_TARGET not supported on this system
    行转列、列转行
  • 原文地址:https://www.cnblogs.com/jxgxy/p/2796822.html
Copyright © 2011-2022 走看看