我有以下情况。
我创建了一个 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
我尝试了,除非以防万一,但这不是正确的方法。