如何(控制)循环开启线程 ?
如何(控制)循环开启线程(即某个线程运行完毕,立即检测出来并开启一个新线程运行)呢 ?
就是总能保证有( x= 5...)个线程在运行。
我弄一天了,还没弄好;想弄个采集数据的简单工具,大歌歌们,教教我吧 。。。
最好能给个实例我学习一下。谢谢谢谢 ~o~
下面是部分代码:
...................................
// aUrlList 局部TStringList变量,保存有N个Url链接地址
Threads:=0; // 全局变量,用来纪录正在运行的线程总数;
nThread:=0; // 局部变量,用来纪录已经开启的线程总数;
// ( 下面想实现程序总是有5个线程同时运行,当然前提是aUrlList中的链接地址足够多 )
while true do
begin
if nThread <= aUrlList.count then
begin
break;
end
else
begin
if Threads < 5 then // ( 这里这样读取全局变量,肯定有误,如何处理呢?我搞不清楚 ... )
begin
New(MyPara); // MyPara为 record类型
MyPara^.Url := aUrlList[nThread];
CreateThread(nil, 0, @aThreadRun, MyPara, 0, ID);
nThread:=nThread+1;
Threads:=Threads+1; // ( 这里这样操作全局变量,肯定有误,如何处理呢?我搞不清楚 ... )
end;
end;
Application.ProcessMessages;
end;
repeat
Application.ProcessMessages;
until ( Threads = 0 );
...................................
上面操纵全局变量 Threads 时,我在其前面加 EnterCriticalSection(CS),其后加 LeaveCriticalSection(CS)时,结果程序也会出问题;怎么弄呢?
----------------------------- 分隔线,下面是 aThreadRun函数 内部分代码 --------------------------------
function aThreadRun(p:xParameter): DWORD; stdcall;
......................
try
try
...............................
.... 部分处理网页源码的code ...
...............................
EnterCriticalSection(CS);
Writeln(oFile,tmp);
Result := 1;
exit;
except
end
finally
begin
......................
Threads := Threads - 1;
LeaveCriticalSection(CS);
ExitThread(0);
end;
.....................................