高分求解:怎么把N个任务(平均)分配到多个线程? (200分)

  • 主题发起人 soFTangeL
  • 开始时间
S

soFTangeL

Unregistered / Unconfirmed
GUEST, unregistred user!
假设我现在有1000个文件(001.txt,002.txt,...)需要一定数量的(比如10个)线程来访问。下面是我创建一定数量线程的代码:
procedure TMainForm.Button1Click(Sender: TObject);
var
FileName:string;
i: integer;
ThreadList: array of TmyThread;
begin
SetLength(ThreadList, strtoint(Txt_ThreadCount.Text));
//Txt_ThreadCount.Text表示创建的线程数量
for i := 0 to length(ThreadList) - 1do
begin
ThreadList := TmyThread.Create(False,FileName);//FileName 为要访问的文件名
ThreadList.OnTerminate := ThreadOver;
end;
end;

如果 FileName 为固定的一个,那当然没多大问题。现在关键是我有很多的文件需要访问。因此现在的问题主要有两个:
一个是如何把这些文件平均分配给指定的线程让他们同时访问?预先分配任务,把文件数除以线程数?比如:1000/10=100,那就每个线程分配100个?那这个怎么实现呢?
第二个就是最好能像Flashget那样,在一个线程完成时,如果发现其他线程还没有完成任务,可以“帮帮忙”,从其他线程的剩余任务里面领取一些文件列表来自己处理。不过这样似乎又不能完全采用上面的“预先分配任务,把文件数除以线程数”了。诚判各位大侠出谋划策。
先谢谢了!
 
我的一个思路,楼主看是否可行
1.建立一个数组,保存线程数组中各线程的状态(True表示正在工作,False表示停止工作,即该线程已经被释放并设置为Nil)
var
ThreadStatus: array[1..10] of Boolean;
2.建立一个线程依次读ThreadStatus中的状态,若为True则表示线程还没有结束
,接着读ThreadStatus[i+1]的状态。若为False并且文件未读完,则
ThreadList := TmyThread.Create(False,FileName);
然后将FileName赋值为下一条文件名
3.直到结束。
有点象移动营业厅的叫号模式
 
不用平均分配,将所有要做的任务放在一个队列里。
每个线程从对首取个任务执行,结束后再从对首取新任务。
只是在队列访问是要注意同步。
 
谢谢 muhx。不过您的方法需要另开一个线程时刻监视。而且
ThreadList := TmyThread.Create(False,FileName);
然后将FileName赋值为下一条文件名
这个“FileName赋值为下一条文件名”的获取也需要泊费一般周折(要考虑同步,不能有重复),所以最终基本采用的是 LeeChange 的思路,即首先把所有的文件名读到一个TstringList 里面,然后在某个线程终止时读取TstringList 的最后一条记录,读完之后将该记录删除。依此类推。但此方法有一个缺点,就是很消耗内存。当记录总数达到一个比较大的值的时候就会占用很多内存。
 
顶部