delphi多线程操作同一个listview,怎么办?

csdn小虫 2009-10-29 09:51:50
我有两个线程同时处理界面中的一个ListView
线程1:
我自己建立的线程类 对象 mythreadObj:
Execute()方法是一个死循环,循环内部有个这样的语句处理ListView

aListItem:=form1.ListView1.Items[i];
Synchronize(SetlistItemicon); //方法setlistitemicon 是设置所选的项的图标
。。。。。。。
。。。。。
end;

线程2中,我用一个timer定时器:
每隔一段时间,就刷新整个Listview中的列表。
就是每隔一段时间,就从一个数组中取出数据,根据数据生成listview中的item

listview1.clear;
根据数组内容,添加Item

我运行程序的时候,有时会出现异常,
应该是 两个线程间 同时操作Listview,所以出现异常


怎么处理呀。希望大虾给个 思路和帮我上面的加段代码
没做过多线程的,帮帮忙,急 急 急
...全文
531 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
s11ss 2009-10-29
  • 打赏
  • 举报
回复
线程2中也用 Synchronize 来同步
csdn小虫 2009-10-29
  • 打赏
  • 举报
回复
我怀疑那个execute()方法中的死循环间的时间间隔太短了,我加个延时的函数,好象就没出现问题。
不知道 是什么原因呀。
我在execute()方法的死循环内部加个延时的函数
procedure execute()
beign
while not Terminated do
begin
......
.....
aListItem:=form1.ListView1.Items[i];
Synchronize(SetlistItemicon); //方法setlistitemicon 是设置所选的项的图标
delay(500);//自己写的延时函数
end;
end;

到底是什么问题???
是不是要用用临界区来做,如果是的话,该怎么做????
请高手指点呀

很急 急 急
csdn小虫 2009-10-29
  • 打赏
  • 举报
回复
procedure TMyThread.Setitemicon;
begin
case pListState of
0:begin
Plistitem.ImageIndex:=0;
end;
1:begin
Plistitem.ImageIndex:=1
end;
2:begin
Plistitem.ImageIndex:=2;
end;
end;

异常提示 就是 violation access 地址 xxxxx 之类的
无条件为你 2009-10-29
  • 打赏
  • 举报
回复
线程同步里面讲的很清楚,方法很多!老生常谈的问题。
wooden954 2009-10-29
  • 打赏
  • 举报
回复
使用同步方法调用函数,这个函数调用会在主线程中调用,不会产生楼主所说的“应该是 两个线程间 同时操作Listview,所以出现异常”,之所以产生异常,是因为楼主的SetlistItemicon过程中的执行过程中产生的,也就是说SetlistItemicon过程中有Bug。
楼主可以把SetlistItemicon过程贴出来看看,还有出现异常的提示信息。
xzhifei 2009-10-29
  • 打赏
  • 举报
回复
//线程单元内
uses SyncObjs;

//定义一个全局变量
var
CS: TCriticalSection;

在操作LV之前调用:
CS.Enter;
操作完成后:
CS.Leave;

initialization
CS := TCriticalSection.Create;
finalization
CS.Free;


线程中操作VCL很正常,比如多线程下载列表就有可能会用到
风之谷 2009-10-29
  • 打赏
  • 举报
回复
为什么要在线程中操作VCL啊。
csdn小虫 2009-10-29
  • 打赏
  • 举报
回复
线程2 是用timer定时器做的的 不能用那个同步的方法
火龙岛主 2009-10-29
  • 打赏
  • 举报
回复
饭桶不是已经给例子了吗?
查查有关线程同步的章节!

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧