N
newester
Unregistered / Unconfirmed
GUEST, unregistred user!
如何(控制)循环开启线程(即某个线程运行完毕,立即检测出来并开启一个新线程运行)呢 ? 就是总能保证有( x= 5...)个线程在运行。 我弄一天了,还没弄好;想弄个采集数据的简单工具,大歌歌们,教教我 。。。 最好能给个实例我学习一下。谢谢谢谢 ~o~ ... 下面是部分代码: ................................... // aUrlList 局部TStringList变量,保存有N个Url链接地址 Threads:=0;
// 全局变量,用来纪录正在运行的线程总数; nThread:=0;
// 局部变量,用来纪录已经开启的线程总数; // ( 下面想实现程序总是有5个线程同时运行,当然前提是aUrlList中的链接地址足够多 ) while truedo
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;
.....................................
// 全局变量,用来纪录正在运行的线程总数; nThread:=0;
// 局部变量,用来纪录已经开启的线程总数; // ( 下面想实现程序总是有5个线程同时运行,当然前提是aUrlList中的链接地址足够多 ) while truedo
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;
.....................................