jachgateによって提供されるアプローチは優れており、おそらくより優れていますが、これを実装したい場合TThreadList
は、サービスの開始時に作成されるサーバー上に が必要になります。TThreadList
スレッドセーフであるため、を使用してください。リストをナビゲートする際のパフォーマンスへの影響を最小限に抑えることができるTThreadList
ように、テーブルごとに設定できます。ロックされているものを制御するには、作成されてリストに渡されるオブジェクトが必要です
TLockedItem = class(TObject)
public
iPK: Integer;
iClientID: Integer;
end;
実際のロックを行うには、次のようなものが必要です。
function LockItem(pPK, pClientID: Integer): Boolean;
var
oLockedItem: TLockedItem;
oInternalList: TList;
iCont: Integer;
bExists: Boolean;
begin
bExists := False;
if (Assigned(oLockedList)) then
begin
oInternalList := oLockedList.LockList;
try
if (oInternalList.Count > 0) then
begin
iCont := 0;
while ((not bExists) and (iCont < oInternalList.Count)) do
begin
oLockedItem := TLockedItem(oInternalList[iCont]);
if (oLockedItem.iPK = pPk) then
bExists := True
else
Inc(iCont);
end;
end;
finally
oLockedList.UnlockList;
end;
if (not bExists) then
begin
oLockedItem := TLockedItem.Create;
oLockedItem.iPK := pPK;
oLockedItem.iClientID := pClientID;
oInternalList := oLockedList.LockList;
try
oInternalList.Add(oLockedItem);
finally
oLockedList.UnlockList;
end;
end;
end;
Result := bExists;
end;
それはあなたが必要とするものの単なるアイデアです。同様のロジックでロック解除メソッドを実行する必要があります。接続が失われた場合に備えて、各クライアントが保持する各 TLockItem のポイントを保持するクライアントのリストが必要になるでしょう。これは決定的な答えではなく、このアプローチを実装したい場合に備えて、方向性を押し付けるだけです。
幸運を