关于多个线程访问TStringList全局变量的同步问题???
关于多个线程访问TStringList的同步问题
关于多个线程访问TStringList的同步问题:
我的想法是:复制TStringList到另一个TStringList变量,来实现在多个线程里同步访问TStringList变量。
如下:
自定义类:
TNodeData = Class
ID, PID, NodeText : string;
end;
全局变量:
m_List: TStringList;
m_List:= TStringList.Create;
m_cs: TCriticalSection;
m_cs:= TCriticalSection.Create;
初始化m_List成员值:
procedure TMainForm.FormCreate(Sender: TObject);
var
NodeData: TNodeData;
qry: TASQLite3Query;
begin
...
while not qry.Eof do
begin
NodeData:= TNodeData.Create;
NodeData.ID := qry.FieldByName('ID').AsString;
pChildNodeData.PID := qry.FieldByName('PID').AsString;
pChildNodeData.NodeText := qry.FieldByName('NodeText').AsString;
m_List.AddObject(NodeData.NodeText,NodeData);
qry.Next;
end;
qry.Close;
qry.Free;
...
end;
因在其它多个线程和主界面线程都有访问m_List,所以想到要做同步:我的想法就是复制一个m_List的副本出来供其它各线程来调用。
复制全局变量m_List的自定义函数:
function CopyStringListContent(ls:TStringList):boolean;
begin
try
try
m_cs.Enter;
ls.Assign(m_List);
result:= true;
finally
m_cs.Leave;
end;
except
result:= false;
end;
end;
线程1里的m_List访问:在副本里访问m_List的值:
var
list: TStringList;
begin
...
list := TStringList.Create;
if not CopyStringListContent(list) then //复制一个与m_List相同值的TStringList新的变量list。
exit;
for i:= 0 to list.Count-1 do
begin
...
list.Objects[i].Free; //操作完成后释放局部变量list里的对象
end;
list.Free;
...
end;
运行以上代码后,这时候假如在其它地方再有访问m_List里的对象就会出错!因为m_List里的对象被释放了。
如下:
for i:= 0 to m_List.Count-1 do
begin
strNodeID := TNodeData(m_List.Objects[i]).ID; //这里就报错了!
strNodeText:= TNodeData(m_List.Objects[i]).NodeText;
m_List.Objects[i].Free;
end;
问题1:执行CopyStringListContent函数里ls.Assign(m_List);后m_List和list变量指向的还是同一个内存块。
所以我改为下面的代码来复制m_List的值,
请问还有更方便的方法吗???
function CopyStringListContent(ls:TStringList):boolean;
var
i:integer;
node:TNodeData;
begin
try
try
m_cs.Enter;
for i:= 0 to m_List.Count-1 do
begin
node := TNodeData.Create;
node.ID := TNodeData(m_List.Objects[i]).ID;
node.PID:= TNodeData(m_List.Objects[i]).PID;
node.NodeText:= TNodeData(m_List.Objects[i]).NodeText;
ls.AddObject(node.NodeText,node);
end;
result:= true;
finally
m_cs.Leave;
end;
except
result:= false;
end;
end;
问题2:请教各位说在多个线程里实现同步同一个全局变量的方法。