0

我有以下情况。
我创建了一个 tcollection 类来处理写入 firebird 数据库。

type TLogFIREBIRDCollection = class (TCollection)
  private
    public
      function  GetItem(Index : Integer) : TLogFIREBIRD_Item;
      function  Add : TLogFIREBIRD_Item;
  end;

type TLogFIREBIRD_Item = class (TCollectionItem)
  private
      fIDWORKFLOW      : Integer;
      fOperationTypeOf : Integer;
      fTypeOf          : Integer;
      fReturn_Code     : Integer;
      fError_Code      : Integer;
      fDataEvent       : TDateTime;
      fLogMessage      : String;
      fProgram_Version : String;
      fProgram_Name    : String;
    public
      function CopyFrom (aSource : TLogFIREBIRD_Item): Boolean;

      property IDWORKFLOW      : Integer   read fIDWORKFLOW      write fIDWORKFLOW;
      property OperationTypeOf : Integer   read fOperationTypeOf write fOperationTypeOf;
      property TypeOf          : Integer   read fTypeOf          write fTypeOf;
      property Return_Code     : Integer   read fReturn_Code     write fReturn_Code;
      property Error_Code      : Integer   read fError_Code      write fError_Code;
      property DataEvent       : TDateTime read fDataEvent       write fDataEvent;
      property LogMessage      : String    read fLogMessage      write fLogMessage;
      property Program_Name    : String    read fProgram_Name    write fProgram_Name;
      property Program_Version : String    read fProgram_Version write fProgram_Version;
  end;

function TLogFIREBIRDCollection.GetItem(Index: Integer): TLogFIREBIRD_Item;
begin
  Result := inherited Items[Index] as TLogFIREBIRD_Item;
end;

function TLogFIREBIRDCollection.Add: TLogFIREBIRD_Item;
begin
  Result := inherited Add as TLogFIREBIRD_Item;
end;

我创建了一个线程类来使用集合将所有项目保留在内存中,直到我有“时间”将它们写入数据库。像连载。

type
  TThreadLoggingFIREBIRD = class(TThread)
  private
    { Private declarations }
    workLog        : TLogFIREBIRD;
    workCollection : TLogFIREBIRDCollection;
  protected

  public
    constructor Create;
    procedure   Execute; override;
    procedure   DoTerminate; override;
    procedure   SignalStart;
    procedure   SignalFinish;
    procedure   Setup(aServer : String; aDatabase : String; aFirebirdUser : String; aFirebirdPass : String; aLogFolderErrors : String; aLogTableName : String; aDaysToKeep : Integer);
    procedure   WriteCollectionLog(aIDWORKFLOW : Integer; aOPERATION_TYPEOF : Integer; aTypeOf : Integer; aReturnCode : Integer; aError_Code : Integer; aDataEvent : TDateTime; aMessage : String; aProgramName : String; aProgramVersion : String);
  end;

procedure TThreadLoggingFIREBIRD.Execute;
var workItem : TLogFIREBIRD_Item;
begin
  while not Terminated do begin
    while workCollection.Count > 0 do begin
      if Terminated then begin
        Break;
      end;
      try
        workItem := workCollection.GetItem(0); <---- error line
      except
      end;
      if workItem <> nil then begin
        workLog.WriteLog(workItem.IDWORKFLOW, workItem.OperationTypeOf, workItem.TypeOf, workItem.Return_Code, workItem.Error_Code, workItem.DataEvent, workItem.LogMessage, workItem.Program_Name, workItem.Program_Version);
      end;
      try
        workCollection.Delete(0);
      except
      end;
    end;

    Sleep(1000);
  end;
end;

procedure TThreadLoggingFIREBIRD.WriteCollectionLog(aIDWORKFLOW : Integer; aOPERATION_TYPEOF : Integer; aTypeOf : Integer; aReturnCode : Integer; aError_Code : Integer; aDataEvent : TDateTime; aMessage : String; aProgramName : String; aProgramVersion : String);
var workItem : TLogFIREBIRD_Item;
begin
  workItem := workCollection.Add;
  workItem.IDWORKFLOW      := aIDWORKFLOW;
  workItem.OperationTypeOf := aOPERATION_TYPEOF;
  workItem.TypeOf          := aTypeOf;
  workItem.Return_Code     := aReturnCode;
  workItem.Error_Code      := aError_Code;
  workItem.DataEvent       := aDataEvent;
  workItem.LogMessage      := aMessage;
  workItem.Program_Name    := aProgramName;
  workItem.Program_Version := aProgramVersion;
end;

现在我收到关于“workItem := workCollection.GetItem(0);”的策略错误 比如访问违规。我的问题是...... WriteCollectionLog 是安全的吗?或更具体……在我“workItem := workCollection.Add;”之后
在集合的计数机制中是否可用,因此可以被执行的方法销毁?

如果是这种情况,那么安全的方法是什么?关于
PS
我尝试了,除非以防万一,但这不是正确的方法。

4

0 回答 0