多线程停止问题。(50分)

  • 主题发起人 主题发起人 garyye
  • 开始时间 开始时间
G

garyye

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个listview是报表类型的。
listview里的行数可以手动添加。
选定其中的一行,然后点击开始按钮就根据该行的数据开启一条线程。线程在点击停止按钮前是不需要停止的。
现在问题是:
1、我如何动态地创建线程,因为我不知道listview有多少行。也不是每一行都必需启动。
2、如何停止某一个线程。而不会影响其他线程的运行。

谢谢!!
 
关键问题就是从一个记录(对应于一行)得到线程的句柄(或者线程实例的地址)
可以用Virtual ListView的方式
也可以自己定义一个变长数组,根据行号引用线程
 
如果使用变长数组和行号操作线程。那假如现在有三行。已经启动了第三行。
但用户这时却删除了第二行。那再引用行号来停止线程就不行了。因为行号已经改变了呀。
 
另外用Virtual ListView是怎么实现?
我没有用过Virtual ListView。能具体点吗?
 
删除行的时候就需要截取事件,同步那个数组了。

使用虚拟listView,程序结构相对好些。你可以搜索一下。
原理很简单的,你把OwnerData属性设置为true,创建一个结构体,用来对应ListView的一行,并且实现这个结构体的数组。在ListView的OnData事件里,把数据传给ListView,你可以在Demo中找到例子。
 
MrMengyi,
怎么得到新线程的句柄。和利用这个句柄停止相应的线程??
 
我也想知道,动态创建线程,同时也不知道需要创建多少个线程,那么想结束一个线程的时候,怎么得到这个线程的句柄。
 
用数组啊,保存每个线程handle,就可以了啊!
 
寻路:
能否具体点?
 
可以用数组保存线程的handle,但是当在listview中选定一个线程的时候,那么怎么对应上它的handle呢?这个问题有点难度了哦,何况上面已经说了,这个listview中不知道有多少条,这就成一个问题了,你的数组需要设置多大呢?不过由此我想到一个问题,我们可以建立一个结构体指针,这个结构体里面主要包含三个字段:
索引:主要是保存listview中对应的index,当删除它前边的数据的时候,这个index应该发生变化;
名字:主要对应listview中的内容的。
线程handle:这个对应它的线程handle。
这里面需要注意的一个重要问题就是,当对listview中的数据进行删除的时候,所删除数据后面的数据的index就发生了变化,这个时候,必须调整更新这个结构指针中后面的index值,保证与listview一致。这样的话,当要结束一个线程的时候,只需要在这个指针里面查找对应的index值,即可得到相应的线程handle,那么结束的时候就方便了。个人看法,不知道是不是合理,望高手指正!
 
TmpThrHandle := TProcThread.Create(false);
这样是不是把句柄存到变量里了?
如果是的话。
closehandle能否安全关闭相应线程??(就是线程关闭了。资源也释放了。)
 
虽然我一般不用listview,但如何没记错的话,listview的item有个data属性,在属性中保存线程对象就可以嘛,想控制,释放都很容易实现,一对一的。
 
没看到listview的item有data属性
只看到有OWERDATA,是你说的那个吗?
 
我也没有找到上面的老大说的data属性!
 
是有一个DATA属性。是POINTER类型。怎么换INTEGER类型的句柄存进去?
 
有Data属性啊?我都忘记了,呵呵。
你强制类型转换就可以了
但是要注意:删除的时候要处理一下线程~
 
强制转换?有强制把INTEGER转成POINTER的函数吗?再说,以后又怎么取值呢?
 
listview 行里,有没有地方可以保存一下线程的句柄的??
 
Data申明为void*
只要不超出范围就没关系了
 
MrMengyi
data属性本来就有的。还要声明吗?
 
后退
顶部