我有两个线程同时处理界面中的一个ListView
线程1:
我自己建立的线程类 对象 mythreadObj:
  Execute()方法是一个死循环,循环内部有个这样的语句处理ListView
  
    aListItem:=form1.ListView1.Items[i];
    Synchronize(SetlistItemicon); //方法setlistitemicon 是设置所选的项的图标
    。
   。。
 end;线程2中,我用一个timer定时器:
  每隔一段时间,就刷新整个Listview中的列表。
  就是每隔一段时间,就从一个数组中取出数据,根据数据生成listview中的item
  
  listview1.clear;
  根据数组内容,添加Item 我运行程序的时候,有时会出现异常,
应该是 两个线程间  同时操作Listview,所以出现异常
怎么处理呀。希望大虾给个 思路和帮我上面的加段代码
没做过多线程的,帮帮忙,急 急  急

解决方案 »

  1.   

    为什么要在线程中操作VCL啊。
      

  2.   

    //线程单元内
    uses SyncObjs;//定义一个全局变量
    var
      CS: TCriticalSection;
      
    在操作LV之前调用:
    CS.Enter;
    操作完成后:
    CS.Leave;initialization
      CS := TCriticalSection.Create;
    finalization
      CS.Free;
    线程中操作VCL很正常,比如多线程下载列表就有可能会用到
      

  3.   

    使用同步方法调用函数,这个函数调用会在主线程中调用,不会产生楼主所说的“应该是 两个线程间  同时操作Listview,所以出现异常”,之所以产生异常,是因为楼主的SetlistItemicon过程中的执行过程中产生的,也就是说SetlistItemicon过程中有Bug。
    楼主可以把SetlistItemicon过程贴出来看看,还有出现异常的提示信息。
      

  4.   

    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 之类的
      

  5.   

    我怀疑那个execute()方法中的死循环间的时间间隔太短了,我加个延时的函数,好象就没出现问题。
    不知道 是什么原因呀。 
    我在execute()方法的死循环内部加个延时的函数
    procedure execute()
    beign
      while not Terminated do
      begin
        ......
         .....
        aListItem:=form1.ListView1.Items[i]; 
        Synchronize(SetlistItemicon); //方法setlistitemicon 是设置所选的项的图标 
         delay(500);//自己写的延时函数
      end;
    end;到底是什么问题??? 
    是不是要用用临界区来做,如果是的话,该怎么做????
    请高手指点呀 很急 急 急
      

  6.   

    线程2中也用 Synchronize 来同步
      

  7.   

    线程2 是用timer定时器做的的  不能用那个同步的方法