我想知道多线程的每一个线程的执行状态和到达每一步的数据,我采用ListView来实时显示。每一个线程创建后我就指定一个ListView.Items上面的每一栏显示我几个变量的值。
结果是,在操作的初期程序一切正常,一定时间后(不定期),莫名的报错“System Error. Code: 1400. 无效的窗口句柄。 ”,这时候查看软件发现listview惊奇的消失了,一片白。话说多线程操作VCL的时候是要加同步来执行,我考虑到这个问题了才定义每一个线程操作ListView的单独一个Items,不与其他线程共用Items。如果说真不能多线程操作的话,那应该运行就会报错呀,不可能等段时间弹出个错误呀。
现在想想还只能用同步来做,但是这样感觉效率很低,不能达到真正的多线程效果。我只是想实时监控每一个线程的每一步变量的值,不知还有其他办法?
各位有何高见,请予以讨论呀。
结果是,在操作的初期程序一切正常,一定时间后(不定期),莫名的报错“System Error. Code: 1400. 无效的窗口句柄。 ”,这时候查看软件发现listview惊奇的消失了,一片白。话说多线程操作VCL的时候是要加同步来执行,我考虑到这个问题了才定义每一个线程操作ListView的单独一个Items,不与其他线程共用Items。如果说真不能多线程操作的话,那应该运行就会报错呀,不可能等段时间弹出个错误呀。
现在想想还只能用同步来做,但是这样感觉效率很低,不能达到真正的多线程效果。我只是想实时监控每一个线程的每一步变量的值,不知还有其他办法?
各位有何高见,请予以讨论呀。
解决方案 »
- 局域网更新计划请教!
- 内存中搜索特征码
- 关于THashedStringList的问题。
- 请问在DBGrid中怎么复制上一条记录到下一条新添的记录。
- 怎么动态添加query里面的fields
- 请问各位,用delphi在sql server 的image字段中存储word的doc文件,超过30k就出错,怎么办?!!
- 怎样把Double类型的变量转成int64位
- delphi5自带的interbase5.5数据库的安装序列号是多少?请各位帮忙!!!谢谢!
- 请问各位高手,钩子中的时间问题怎样处理.??????????????????????
- 100分求教,存储过程的两个问题!
- delphi6做网页ISAPI的.dll,当前目录却是C:\WINDOWS\SYSTEM32
- delphi 超长窗口滚动
在线程里添加一个PUBLIC变量,可以是string型的,用来直接显示内容;
在线程里添加一个过程(不能是函数),用来设置变量值的值;
在线程的execute中需要显示进度的地方同步调用这个过程;
在窗口中添加timer,循环读取各子线程中的变量值,加到listview中,就行了
你在其它线程里操作肯定不行的.一般简单办法就是由你的线程向主界面Send或者Post消息.
或者用Delphi自带的线程同步方法.
uses
SyncObjs;定义全局变量:
cs: TCriticalSection;窗体创建时:
cs := TCriticalSection.Create;窗体释放时:
FreeAndNil(cs);你任意线程操作ListView时:
cs.Enter ;操作结束后:
cs.Leave ;
线程同步的时候,在线程中只有一个线程操作VCL,但是主线程也可能操作VCL啊!这样主线程和子线程同时访问一个VCL控件.不就冲突了吗?
通过Synchronize来调用显示过程是不会有问题的我估计你是把类似这样的代码ListView.Item[I].Caption := '数据';放在了线程中,这样必然会出现问题