procedure TForm1.OnCreate(Sender: TObject); begin FLockObj: TCriticalSession.Create; end; procedure TForm1.Lock; begin FLockObj.Enter; end; procedure TForm1.UnLock; begin FLockObj.Leave; end; constructor TMyThread.Create; begin FFileName := TStringList.Create; ... end;procedure TMyThread.SomeProcOrFunc; var I: Integer; begin FOwnerForm.Lock; try FFileName.Add('a new filename'); for I := 0 to FFileName.Count - 1 do .... finally FOwnerForm.UnLock; end; end; TThreadList Method:type TMyThread = class(TThread); private ThreadLock: TThreadList; ... end; constructor TMyThread.Create; begin ThreadLock := TThreadList.Create; .. end;do some thing begin ThreadLock.Add(FFileName); try with ThreadLock.LockList do begin FFileName.Add(''); for I := 0 to FFileName.Count - 1 do ... end; finally ThreadLock.UnlockList; end; end;
这样strings.count引发的公用问题!
有一个线程安全的LIST,BUT我忘了名字了……:)
TForm1 = class(TForm)
private
FLockObj: TCriticalSession;
procedure Lock;
procedure UnLock;
..
end;TMyThread = class(Thread)
private
FOwnerForm: TForm1;
FFileName: TStrings;
..
end;
procedure TForm1.OnCreate(Sender: TObject);
begin
FLockObj: TCriticalSession.Create;
end;
procedure TForm1.Lock;
begin
FLockObj.Enter;
end;
procedure TForm1.UnLock;
begin
FLockObj.Leave;
end;
constructor TMyThread.Create;
begin
FFileName := TStringList.Create;
...
end;procedure TMyThread.SomeProcOrFunc;
var
I: Integer;
begin
FOwnerForm.Lock;
try
FFileName.Add('a new filename');
for I := 0 to FFileName.Count - 1 do
....
finally
FOwnerForm.UnLock;
end;
end;
TThreadList Method:type
TMyThread = class(TThread);
private
ThreadLock: TThreadList;
...
end;
constructor TMyThread.Create;
begin
ThreadLock := TThreadList.Create;
..
end;do some thing
begin
ThreadLock.Add(FFileName);
try
with ThreadLock.LockList do
begin
FFileName.Add('');
for I := 0 to FFileName.Count - 1 do
...
end;
finally
ThreadLock.UnlockList;
end;
end;