我想知道多线程的每一个线程的执行状态和到达每一步的数据,我采用ListView来实时显示。每一个线程创建后我就指定一个ListView.Items上面的每一栏显示我几个变量的值。
结果是,在操作的初期程序一切正常,一定时间后(不定期),莫名的报错“System Error.  Code: 1400. 无效的窗口句柄。 ”,这时候查看软件发现listview惊奇的消失了,一片白。话说多线程操作VCL的时候是要加同步来执行,我考虑到这个问题了才定义每一个线程操作ListView的单独一个Items,不与其他线程共用Items。如果说真不能多线程操作的话,那应该运行就会报错呀,不可能等段时间弹出个错误呀。
现在想想还只能用同步来做,但是这样感觉效率很低,不能达到真正的多线程效果。我只是想实时监控每一个线程的每一步变量的值,不知还有其他办法?
各位有何高见,请予以讨论呀。

解决方案 »

  1.   

    一个线程操作完,已经释放了listview的指向,你另一个线程再去搞,不就出错了
      

  2.   

    确实是我没说清楚,listview是放在主窗体上的。
      

  3.   

    没有对listview释放的,仅仅是搞而已。
      

  4.   

    你不用对它释放,你就老老实实的同步vcl吧
      

  5.   

    我也经常用这个,我的方法有点笨,但很有效:
    在线程里添加一个PUBLIC变量,可以是string型的,用来直接显示内容;
    在线程里添加一个过程(不能是函数),用来设置变量值的值;
    在线程的execute中需要显示进度的地方同步调用这个过程;
    在窗口中添加timer,循环读取各子线程中的变量值,加到listview中,就行了
      

  6.   

    呵呵,好蛋疼的办法啊。由主线程主动去读取子线程的值这就规避了子线程操作主线程的VCL控件。但是阁下的办法会有数据丢失的情况,因为timer本来就不与线程同步的,比较难控制。比较而言,用子线程中的同步办法更有效。
      

  7.   

    ListView是属于界面线程也就是主线程的.
    你在其它线程里操作肯定不行的.一般简单办法就是由你的线程向主界面Send或者Post消息.
    或者用Delphi自带的线程同步方法.
      

  8.   

    每个线程一个ListView吧,多个线程操作一个ListView,必然就是临界资源了,没做临界资源处理肯定会出错
      

  9.   

    “我考虑到这个问题了才定义每一个线程操作ListView的单独一个Items,不与其他线程共用Items。”你真认为这个不是共用么……汗你一个。简单方法:引用:
      uses
        SyncObjs;定义全局变量:
      cs: TCriticalSection;窗体创建时:
      cs := TCriticalSection.Create;窗体释放时:
      FreeAndNil(cs);你任意线程操作ListView时:
      cs.Enter ;操作结束后:
      cs.Leave ;
      

  10.   

    线程操作VCL最好使用Synchronize进行同步用临界,只是线程同步,而不是VCL同步!
      

  11.   

    不见得所有线程都是采用Delphi的TThread,而且Synchronize实际也采用了CreateEvent。
      

  12.   

    我在使用多线程时,也出现过和楼主一样的现象.最后改为在线程中新增一个类,由类来和VCL控件交互,线程只是调用类方法.就没有出现问题了.
      

  13.   

    线程同步后同一时间只有一个线程操作VCL,貌似Synchronize这个的效果也是一样的吧?
      

  14.   


    线程同步的时候,在线程中只有一个线程操作VCL,但是主线程也可能操作VCL啊!这样主线程和子线程同时访问一个VCL控件.不就冲突了吗?
      

  15.   

    我觉得是LZ代码写的有问题吧,如果是显示数据的话(这种动作是不会阻塞的)
    通过Synchronize来调用显示过程是不会有问题的我估计你是把类似这样的代码ListView.Item[I].Caption := '数据';放在了线程中,这样必然会出现问题
      

  16.   

    VCL控件是线程不安全的当你有类似的ListView.Item[I].Caption := '数据';去访问VCL控件的时候需要使用内存安全方法,你可以去看万一的博客  !!!! 
      

  17.   

    可以在线程里使用postmessage来做