如何控制产生线程的数量(100分)

  • 主题发起人 主题发起人 tanglu
  • 开始时间 开始时间
T

tanglu

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在用多线程方式下载文件,一个文件开一个线程。
但只想开5个,我有个计数器,每创建一个线程就加1,
线程终止就减1,但是如何在满了5个后挂起,等待线程释放呢?
我试着用While FThreadCount=5do
begin
end;
的死循环,
但是它真的就死在那里了!
我把线程的优先级改成最高,仍然不行。
大家有什么好主意?
 
呵呵,我刚写过这个东西,有两种方法哦:
1、用Timer,定期检查。
2、在线程的OnTerminate中检查。
 
如果你有兴趣,可以发信给我,讨论讨论。
把源码发在这里太长了。
 
是不是一些资源没有进行互斥。造成了死锁
 
如果你简单的用begin
... end,那就需要
begin
Application.ProcessMessages;
...
end;
 
感谢DreamTiger,在你的提示下我已经解决这个问题了。
 
接受答案了.
 
在线程同步机制中有个“信号量”的概念,可以解决这个问题,不需要timer。
定义一个全局变量
g_semThrdCnt : THandle=0;
在创建线程之前必须初始化g_semThrdCnt,
g_semThrdCnt:= CreateSemaphore(nil,5,5,nil);//信号量初始值是5,最大值是5
在线程的Execute事件中如下编写
procedure TMyThread.Execute();
begin
WaitForSingleObject(g_semThrdCnt,INFINITE);
//do
your work here....
end;

最后在程序结束之前要关闭句柄
if ( g_semThrdCnt <> 0) then

begin
CloseHandle(g_semThrdCnt);
g_semThrdCnt:= 0;
end;
 
Racer_y老兄,
你现在还记得如何通过信号量来控制线程数吗?给我段代码吗?我程序不行了。
EMAIL:ZQZCS@HOTMAIL。COM
qq:181373067
 
后退
顶部