私のアプリケーションはモノスレッドでしたが、今ではパフォーマンスを向上させるためにマルチスレッドにする必要があります。
次のアーキテクチャに List と ListItem があります。
TBListItem = class(TBusinessObjects)
private
FList : TBList;
protected
//methods
public
constructor Create(AList: TBList); reintroduce;
//other methods
//properties...
end;
継承の代わりに、リストの構成を優先します。
TBList = class(TPersistent)
private
FItemClass : TBListItemClass; //class of TBListItem
//this is used to AddObject(key, object) of the TStringList duplicates are no allowed
function BuildKey(ArrayOfKeys: array of Variant): string;
protected
//we use a stringlist to save the items
FList: TStringList;
function GetItem(Index: Integer): TBListItem;
//methods like Load(); Unload(); Save();
public
constructor Create(ARefClassItem: TBListItemClass); reintroduce;
//these methods use buildkey
function Add(ArrayOfKeys: Array of Variant): TBListItem; reintroduce;
function FindByKey(const ArrayOfKeys: array of Variant): TBListItem;
//other methods
//properties...
end;
ADD() メソッドで次のようにします。
var Index: Integer;
begin
Index:= FList.IndexOf(BuildKey(ArrayOfKeys));
if Index <> -1 then
Result:= TBListItem(FList.Objects[Index])
else
begin
Result:= FListItemClass.Create(Self);
Result.FCodigo:= ArrayOfKeys;
//load data from database.
FList.AddObject(BuildKey(ArrayOfKeys), Result)
end;
end;
前述したように、このオブジェクトは実行時にキャッシュ データを記録するために使用されますが、オブジェクトを読み書きする必要があるたびに、次のことを行う必要があります。
EnterCriticalSection(instance of TRTLCriticalSection);
//Do Stuff
LeaveCriticalSection(Same instance);
そこから継承したクラスが無数にあるため、アーキテクチャを大きく変更することはできません。
プロセスを実行すると、プロセッサのグラフィックに多くのスパイクが発生し、多くのダウンタイムも発生します。
システムは Delphi 6 コンパイラからコンパイルされます。
クリティカル セッションは、ユニットの初期化で作成されました。
これを行う別の方法はありますか?
少なくとも読み取りをロックしないでください。
また、整合性を保証する必要があり、同じキーを持つ 2 つのオブジェクトは許可されません。