现在写一个一直运行的线程,符合条件的写入多个tstinglist(全局变量),用一个timer访问tstringlist,出现不同步怎么办?
例如:
线程大概这样:
procedure aaa.Execute ;
var
a:integer;
begin
a=0
while a=0 do
begin
if 条件满足 then
begin
EnterCriticalSection(Critical4);//进入临界段,Critical4已作为全局变量声明了
bt.add('xxxx');
at.add('xxxx');
finally
LeaveCriticalSection(Critical4);//退出临界段
end;
end;
end;//以上线程应该一直运行timer里面是:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if cx<=bt.count-1 then
begin
listbox1.items.add(bt.strings[cx]);
listbox2.items.add(at.strings[cx]);//这里发现两个值不匹配,和实际找到的好像叉掉了,不同步?
end;
cx:=cx+1;
end;
有的时候居然cx还会等于bt.count,估计是我单线程思维习惯了。
以上是不是多线程思路不对啊?
例如:
线程大概这样:
procedure aaa.Execute ;
var
a:integer;
begin
a=0
while a=0 do
begin
if 条件满足 then
begin
EnterCriticalSection(Critical4);//进入临界段,Critical4已作为全局变量声明了
bt.add('xxxx');
at.add('xxxx');
finally
LeaveCriticalSection(Critical4);//退出临界段
end;
end;
end;//以上线程应该一直运行timer里面是:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if cx<=bt.count-1 then
begin
listbox1.items.add(bt.strings[cx]);
listbox2.items.add(at.strings[cx]);//这里发现两个值不匹配,和实际找到的好像叉掉了,不同步?
end;
cx:=cx+1;
end;
有的时候居然cx还会等于bt.count,估计是我单线程思维习惯了。
以上是不是多线程思路不对啊?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货