请问CB中的关于TThreadList用法的问题(在线等候!)(50分)

  • 主题发起人 主题发起人 ebeggar
  • 开始时间 开始时间
E

ebeggar

Unregistered / Unconfirmed
GUEST, unregistred user!
SPThreadList=new TThreadList;
SPThreadList->Clear();
for (int i=0;i<sComList->Count;i++)
{
SPCThread=new SPComm(..., ..., ...);
SPThreadList->Add(SPCThread);
}
其中SPComm为Thread类,
然后我应该怎么使用SPThreadList中的线程呢?
 
TThreadList不是这么用的。
其实它是一个线程安全的List,就是说多个线程之间可以不加限制地对它进行增加,删除,移动的
操作。
并不是指它上面的对象就是多线程对象
 
请问szf,那我希望打开多个线程(个数未知),在某种情况下使用其中的某个线程,
那该怎么用呢?CB中有没有线程池的概念呢?
 
请问ThreadID能否解决这样的问题,又应该怎么使用呢?
 
假设是一个容量为iTotal=10的线程池,线程类为TYourThd,初始话如下:
procedure InitPool;
var aThd:TYourThread;
begin
for i:=1 to iTotaldo
begin
aThd:=TYourThread.Create(True);
//休眠态创建
WorkThdList.Add(aThd);
end;
使用时,建议你用轮训,查看每个thread的状态,决定启动哪一个:
function FirstAvaThd:TYourThread;
begin
for i:=0 to WorkThdList.Count-1do
if not TYourThd(WorkThdList.Items).Suspend then
Result:= TYourThd(WorkThdList.Items);
Exit;
end;
这样你就可以获得可用的线程指针了,当然,如果你想用ThreadID来驱动线程池,可以写成
function FirstAvaThd(aID:Integer):TYourThread
begin

...
if TYourThd(WorkThdList.Items).ThreadID = aID then
Result:= TYourThd(WorkThdList.Items);
...
end;
呵呵,写了这么多,不知道对你有用否,其实,架子就是这样了,将生成的Thread放到
TList里面,然后对Tlist.Items强制转换为tthread,就可以了,建议多看看TThread和
TList的文档

to ebeggar:
最近想分想的会发疯了,呵呵
 
To windcolor:
呵呵,我先去试试强制类型转换,肯定会送分给你的,^_^
Delphi中可以使用TMyThread(TList.Items)来转换,CB中怎么转啊?
 
呵呵,类型转换搞定了
(MyThread *)...
 
呵呵,搞定了,线程的同步花了我好多时间!
给各位大侠送分了,少少分数,不成敬意,多谢多谢!
 
后退
顶部