多线程操作VCL控件

chenjun_0312 2010-12-09 10:49:05
我想知道多线程的每一个线程的执行状态和到达每一步的数据,我采用ListView来实时显示。每一个线程创建后我就指定一个ListView.Items上面的每一栏显示我几个变量的值。
结果是,在操作的初期程序一切正常,一定时间后(不定期),莫名的报错“System Error. Code: 1400. 无效的窗口句柄。 ”,这时候查看软件发现listview惊奇的消失了,一片白。话说多线程操作VCL的时候是要加同步来执行,我考虑到这个问题了才定义每一个线程操作ListView的单独一个Items,不与其他线程共用Items。如果说真不能多线程操作的话,那应该运行就会报错呀,不可能等段时间弹出个错误呀。
现在想想还只能用同步来做,但是这样感觉效率很低,不能达到真正的多线程效果。我只是想实时监控每一个线程的每一步变量的值,不知还有其他办法?
各位有何高见,请予以讨论呀。
...全文
876 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
软件钢琴师 2011-10-27
  • 打赏
  • 举报
回复
持续关注中
formernetcn 2011-02-14
  • 打赏
  • 举报
回复
线程发信息
oloveuxyz 2011-02-14
  • 打赏
  • 举报
回复
可以在线程里使用postmessage来做
dai78 2011-02-14
  • 打赏
  • 举报
回复
搞定了没有啊
Mit1208 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 chenjun_0312 的回复:]
引用 21 楼 wellnj 的回复:
VCL控件是线程不安全的

当你有类似的ListView.Item[I].Caption := '数据';去访问VCL控件的时候

需要使用内存安全方法,你可以去看万一的博客 !!!!

能否给个地址?
[/Quote]

http://www.cnblogs.com/del/
chenjun_0312 2011-02-12
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 wellnj 的回复:]
VCL控件是线程不安全的

当你有类似的ListView.Item[I].Caption := '数据';去访问VCL控件的时候

需要使用内存安全方法,你可以去看万一的博客 !!!!
[/Quote]
能否给个地址?
taste品味 2010-12-17
  • 打赏
  • 举报
回复
进入操作时先锁定,用完解锁给其它线程用。
无语孩童 2010-12-17
  • 打赏
  • 举报
回复
VCL控件是线程不安全的

当你有类似的ListView.Item[I].Caption := '数据';去访问VCL控件的时候

需要使用内存安全方法,你可以去看万一的博客 !!!!

一如当初 2010-12-16
  • 打赏
  • 举报
回复
我觉得是LZ代码写的有问题吧,如果是显示数据的话(这种动作是不会阻塞的)
通过Synchronize来调用显示过程是不会有问题的

我估计你是把类似这样的代码

ListView.Item[I].Caption := '数据';

放在了线程中,这样必然会出现问题
lhy 2010-12-15
  • 打赏
  • 举报
回复
你可以在子线程里向主线程发自定义消息。
Mit1208 2010-12-15
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 chenjun_0312 的回复:]
引用 13 楼 lovemit 的回复:
线程操作VCL最好使用Synchronize进行同步

用临界,只是线程同步,而不是VCL同步!

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

线程同步的时候,在线程中只有一个线程操作VCL,但是主线程也可能操作VCL啊!

这样主线程和子线程同时访问一个VCL控件.不就冲突了吗?
chenjun_0312 2010-12-11
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lovemit 的回复:]
线程操作VCL最好使用Synchronize进行同步

用临界,只是线程同步,而不是VCL同步!
[/Quote]
线程同步后同一时间只有一个线程操作VCL,貌似Synchronize这个的效果也是一样的吧?
chenjun_0312 2010-12-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 yhloveys 的回复:]
我在使用多线程时,也出现过和楼主一样的现象.

最后改为在线程中新增一个类,由类来和VCL控件交互,线程只是调用类方法.

就没有出现问题了.
[/Quote]
阁下的这个类实例化对象后,貌似多线程操作这个对象也要用同步或者临界资源来处理吧?
  • 打赏
  • 举报
回复
不见得所有线程都是采用Delphi的TThread,而且Synchronize实际也采用了CreateEvent。
Mit1208 2010-12-10
  • 打赏
  • 举报
回复
线程操作VCL最好使用Synchronize进行同步

用临界,只是线程同步,而不是VCL同步!
  • 打赏
  • 举报
回复
“我考虑到这个问题了才定义每一个线程操作ListView的单独一个Items,不与其他线程共用Items。”

你真认为这个不是共用么……汗你一个。

简单方法:

引用:
uses
SyncObjs;

定义全局变量:
cs: TCriticalSection;

窗体创建时:
cs := TCriticalSection.Create;

窗体释放时:
FreeAndNil(cs);

你任意线程操作ListView时:
cs.Enter ;

操作结束后:
cs.Leave ;
goodhj 2010-12-10
  • 打赏
  • 举报
回复
每个线程一个ListView吧,多个线程操作一个ListView,必然就是临界资源了,没做临界资源处理肯定会出错
yhloveys 2010-12-10
  • 打赏
  • 举报
回复
我在使用多线程时,也出现过和楼主一样的现象.

最后改为在线程中新增一个类,由类来和VCL控件交互,线程只是调用类方法.

就没有出现问题了.
bdmh 2010-12-09
  • 打赏
  • 举报
回复
你不用对它释放,你就老老实实的同步vcl吧
chenjun_0312 2010-12-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]
一个线程操作完,已经释放了listview的指向,你另一个线程再去搞,不就出错了
[/Quote]
没有对listview释放的,仅仅是搞而已。
加载更多回复(6)

5,927

社区成员

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

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