使用Tthread线程类时如何控制线程数量?

ADSLAN 2011-12-12 10:26:19
使用多线程时我现在都用 TThread线程类了
但是如何控制线程数量方面还有点疑问请教

TSearchThread = class(TThread)
//
end;

目前我的作法就是定制一个全局变量
var
I_ThreadCount: Integer; //线程数量

然后
//------- 线程类创建时
constructor TMyThread.Create()
begin
inherited Create(False);
InterlockedIncrement(I_ThreadCount); //线程计数+1
end;

//------- 线程类销毁时
destructor TMyThread.Destroy;
begin
InterlockedDecrement(I_ThreadCount); //线程计数-1
end;

这样来创建线程任务
with TMyThread.Create(S_Kw, S_WebFiletype) do
begin
end;

然后创建后循环判断这个线程数量 I_ThreadCount
超过数量就一直循环SLEEP

// 判断线程 来限制同时运行线程数量
while I_ThreadCount >= 9 do //限制线程数
begin
Application.ProcessMessages;
Sleep(10);
end;

百度了很多 都没看到是线程类是怎么控制线程数量的(线程池不会用)
我这个目前来看效果还行,就是感觉不是正道,
不知道大家是怎么控制线程数量的?
特此请教

...全文
464 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ADSLAN 2011-12-17
  • 打赏
  • 举报
回复
拖久了 现在结贴
s11ss 2011-12-14
  • 打赏
  • 举报
回复
Sockets单元搜索ThreadPool
Rex_love_Burger 2011-12-13
  • 打赏
  • 举报
回复
看看线程池的相关资料
chhrsas 2011-12-13
  • 打赏
  • 举报
回复
线程数量这样控制不妥吧,如果无限请求创建,你这样就创建了无限多个线程,只是真正运转的只有9个线程而以,本质上线程数量仍然没有控制住。
应该是通过 thread,写一个的类方法 class function CreateMyThread():thread;来创建,将 构造 函数 私有化,这样,如果到上限了就不与分配,或者说维护一个任务队列,空下来的线程到队列中取任务,也省去了重复创建线程的资源消耗。
Harryfin 2011-12-13
  • 打赏
  • 举报
回复
其实不要把线程池想得多复杂,最简单的就是一个封装了用于记录线程的LIST的类,再加点方法属性这样
ADSLAN 2011-12-13
  • 打赏
  • 举报
回复
-.- 总不能大家都是这样来控制线程数的吧
主要是 判断线程数然后循环那地方感觉不正规.
funxu 2011-12-13
  • 打赏
  • 举报
回复
LZ表谦虚了,代码可以做范例了
ADSLAN 2011-12-13
  • 打赏
  • 举报
回复
感谢LS上的 顶起来 希望更多人看到
bdmh 2011-12-13
  • 打赏
  • 举报
回复
可行的,不要觉得线程池多磨高深,你认为控制数量,不计数还能怎样
kaikai_kk 2011-12-13
  • 打赏
  • 举报
回复
LZ的方法可行
nm_wyh 2011-12-13
  • 打赏
  • 举报
回复
这写法确实是有问题! 像6楼所说你可以维护一个线程队列(其实就是线程池的概念).不要搞那复杂的,只要简单一点的就可以。
1、定义一个结构体
ThreadList = Record
ThreadHwndList:TStrings; //线程句柄列表(可以方便的控件线程)
ThreadCount:Integer; //线程总数量
... //如果有其他需要记录的继续写
end;
2、创建线程时判断ThreadCount的数量。
3、创建时ThreadCount + 1; 结束时ThreadCount -1;
这是一个最简单的东西了。要真正使用还需要好好考虑一下,方法应该很多。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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