我想按時間從服務器獲取一些查詢,并在記錄陣列上列出這個 URL 查詢。
為了釋放記憶體,必須釋放 procced 陣列的元素。此程序在執行緒上以防止 App 凍結。如果陣列沒有鎖定,可能洗掉元素會因為其他元素正在處理或添加或洗掉元素的索引發生變化而引發例外。
我的問題是:“如何鎖定記錄陣列以在執行緒中添加和洗掉元素?”
為了理解我的實際應用程式代碼,此示例代碼已簡化:
uses IdHTTP;
type
tMyRecAra=record
sta:integer;
url:string;
// ...
// ...
end;
var MyRecAra: array of tMyRecAra;
procedure TfoTestAra.btAddClick(Sender: TObject);
var cou:integer;
begin
// start lock array MyRecAra ?
cou:=length(MyRecAra);
SetLength(MyRecAra, length(MyRecAra) 1);
MyRecAra[cou].sta:=0;
MyRecAra[cou].url:='http:/......';
//- stop lock array MyRecAra ?
end;
procedure TfoTestAra.btStartClick(Sender: TObject);
var
IdHTTP1:TIdHTTP;
mainThr,curThr : TThread;
cStream:TMemoryStream;
begin
mainThr := TThread.CreateAnonymousThread(
procedure
begin
while true {or other condition} do
begin
curThr := TThread.CreateAnonymousThread(
procedure
var i:integer;
begin
// start lock array MyRecAra ?
for i := 0 to (length(MyRecAra)-1) do
begin
if (MyRecAra[i].sta=0) then
begin
MyRecAra[i].sta:=1;
//...
//..
{for example : IdHTTP1.Get(MyRecAra[i].url,cStream)};
//...
//..
end;
end;
//- stop lock array MyRecAra ?
end);
curThr.Start;
sleep(5000);
end;
end);
mainThr.start;
end;
procedure TfoTestAra.Timer1Timer(Sender: TObject);
var
sumFee:integer;
i, j:integer;
begin
// timer.interval=10000;
// start lock array MyRecAra?
sumFee:=0;
for i := 0 to (length(MyRecAra)-1) do
begin
if (MyRecAra[i].sta=1) then
begin
inc(sumFee);
for j := (i 1) to sumFee-1 do
begin
if (MyRecAra[j].sta <> 1) then
MyRecAra[i]:=MyRecAra[j]
end;
end;
end;
if sumFee<>0 then
SetLength(MyRecAra, (length(MyRecAra)-sumFee));
// stop lock array MyRecAra ?
end;
End.
uj5u.com熱心網友回復:
您可以使用鎖來保護對共享資料的訪問,然后在您訪問資料的所有地方的一般模式是:
Lock.Enter;
try
// procected code
finally
Lock.Leave;
end;
您需要在與需要保護的資料相同的范圍內宣告鎖變數,并且需要在第一次使用該鎖之前初始化該鎖,并在不再需要時釋放它。
例如,如果您的MyRecAra單元中是全域資料,則Lock還需要全域并在單元的初始化部分初始化并在終結部分釋放。
如果MyRecAra是表單或其他類Lock中的欄位,則也將是該類中的欄位,在建構式中初始化并在解構式中釋放。
常用的鎖是TCriticalSection. 還有其他型別的鎖,但首先這個就可以了。
var
Lock: TCriticalSection;
MyRecAra: TMyRecAra;
initialization
Lock := TCriticalSection.Create;
finalization
Lock.Free;
end.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/388574.html
