如何(控制)循环开启线程 ?

hahacss1949 2009-11-26 08:03:58
如何(控制)循环开启线程(即某个线程运行完毕,立即检测出来并开启一个新线程运行)呢 ?
就是总能保证有( 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;
.....................................
...全文
188 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hahacss1949 2009-11-27
  • 打赏
  • 举报
回复
不是特指开5个线程,而是泛指开某一指定数量的线程 ... 不能一次所有线程同时运行,有好多链接Url,一起开,机器也吃不消;我没有什么编程基础,谁弄个实例教教我吧.Google\baidu了好多次了,还是没整明白;程序在单核CPU机器上还能运行,多核就运行不起来了;我不知道什么东东去控制管理有序地开线程
xjq2003 2009-11-27
  • 打赏
  • 举报
回复
应该换个思路来解决问题。

为什么一定要5个线程?

既然是线程,一起执行就是了,也不影响系统性能吧
hjkto 2009-11-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 piao_live 的回复:]
个人认为用信号量比较好些,你可以网上找找关于线程信号量方面的内容。
[/Quote]

 这头像我喜欢
Seamour 2009-11-27
  • 打赏
  • 举报
回复
如4楼所说,用一个调度线程和 semaphore 处理是非常方便的
wliaoc 2009-11-27
  • 打赏
  • 举报
回复
我的意思是你创建的查询线程里那部分代码是不断查询线程数的?
wliaoc 2009-11-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hahacss1949 的回复:]
引用楼主 hahacss1949 的回复:
如何(控制)循环开启线程(即某个线程运行完毕,立即检测出来并开启一个新线程运行)呢 ?
就是总能保证有( 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;
.....................................

上面的“if nThread <= aUrlList.count then”应该是:“if nThread >= aUrlList.count then ”不小心输入错了


[/Quote]

如果这样改的话,一会就跳出了
nThread>5 后不是就没法再跳进去了?
hahacss1949 2009-11-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 hahacss1949 的回复:]
如何(控制)循环开启线程(即某个线程运行完毕,立即检测出来并开启一个新线程运行)呢 ?
就是总能保证有( 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;
.....................................
[/Quote]
上面的“if nThread <= aUrlList.count then”应该是:“if nThread >= aUrlList.count then ”不小心输入错了

fulirongWY 2009-11-26
  • 打赏
  • 举报
回复
来学习的
hjkto 2009-11-26
  • 打赏
  • 举报
回复
up
hahacss1949 2009-11-26
  • 打赏
  • 举报
回复
谢谢楼上的,我目前就学过一点跟采集有关的知识 ... 我去看看信号量是个什么东东 ... 哈哈
明儿晚结帖
piao_live 2009-11-26
  • 打赏
  • 举报
回复
个人认为用信号量比较好些,你可以网上找找关于线程信号量方面的内容。

16,748

社区成员

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

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