请问CB中多线程的问题(在线等候)(100分)

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

ebeggar

Unregistered / Unconfirmed
GUEST, unregistred user!
希望根据某些设置打开多个线程,在某种情况下使用其中的某个或某些线程,
该如何使用TThreadID呢?另外CB中有没有线程池的概念呢?
 
线程池是一种设计思想,是由操作系统支持的,与用什么开发工具无关。用bcb或delphi,
是可以达到你想要的效果的。
TWorkThdList:TList;
TWorkThdList.Add(你的工作线程1);
..
TWorkThdList.Add(你的工作线程n);
....//some code to让你所有的工作线程都休眠。
如果需要工作线程启动,遍历TWorkThdList中的每个线程,返回第一个可用的工作线程(
not suspend),就可以了。
写的很简单,但要点就是这么多了:TList+TThread,如果要做线程调度,排队,可以从
TList下继承一个自己的ThreadPool,进行操作
 
谢谢WindColor的解释。
如果TWorkThdList中的线程全部可用,而我需要同时使用他们,是不是根据TThreadID去使用呢?
如果是,怎么样通过TThreadID使用其中的某个线程?
 
假设是一个容量为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的文档
 
我应该怎么样去使用某个线程中的方法呢?
使用TWorkThdList[0].fun1()?这样不行啊。
TWorkThdList[0]是string而不是TThread
不知我这样描述清楚了没有?
 
呵呵,我去试试强制转换
 
呵呵,搞定了,线程的同步花了我好多时间!
给windcolor大侠送分了,少少分数,不成敬意,多谢多谢!
 
后退
顶部