我做了个多线程复制的小工具,用的是CopyFile函数,复制128M的几个视频,但是多线程复制的速度不理想
1个线程复制用了5.5秒
3个线程却用了6.07秒,
复制1.25G的文件
1个线程用了205s
10个线程用了2.6.5s
为什么会这样呢?
各位帮帮忙看下procedure Copy();                          //复制
var
i: word;
begin
  with MainForm do
  begin
    Path := Edit.Text;   //path 是个全局的string变量
    for i := 0 to FList.Count - 1  do  //filelist是储存目标文件路径的stringlist变量
    begin
      if  DirectoryExists(Path)then
      begin
        if CopyFile(PChar(FList[i]),Pchar(Path +'\'+ ExtractFileName(FList[i])),false) then
        begin
          Cs.Enter; //cs是个全局的临界区类
          inc(Proc);//d当前进度
          StatusBar.Panels[3].Text := Format('进度: %d/%d',[Proc,FileMemo.Lines.Count]);
          ProgressBar.Position := ProgressBar.Position + 1;
          RichEdit.Lines.Add('[提示] 文件'+Flist.Strings[i]+'复制成功');
          Cs.Leave;
          Continue;
        end
        else
        begin
          Cs.Enter;
          RichEdit.Lines.Add('');
          RichEdit.SelStart := Echo.GetTextLen;
        RichEdit.Text :=  Format('%s[提示] 文件“%s”复制失败',[Echo.Text,Flist.Strings[i]]);
         RichEdit.SelLength := Length( Format('[提示] 文件“%s”复制失败',[Flist.Strings[i]]));
          Echo.SelAttributes.Color := clRed;
          Cs.Leave;
        end;
      end;
    end;
  end;
  Dec(TCount);
end;

解决方案 »

  1.   

    谁告诉你线程一定会快了,cpu负担增加了,还要调度线程,你说是什么结果
      

  2.   

    读了C盘读D盘,再读C盘再读D盘,结果会让磁盘不停的抖动。没有单线程操作来的快。
      

  3.   

    那类似FastCopy之类的快速操作是怎么实现的啊?
    就是说这样没什么意义了?
      

  4.   

    FastCopy?我猜它是把尽量多的文件内容读到内存里然后再写,相当于开辟一个大缓存,理论上会快一点点,不过在win7下就不一定了,你可以测试一下。
      

  5.   

    您认为这有可能么
    delphi是windows下的开发工具
    请您认真负责地回答帖子
      

  6.   

    线程就是分配CPU的时间,在单线程和多线程拷贝文件上,理论上CPU时间是一至的,但是分别拷贝不同段文件时,磁头要移动位置。时间上就不及了。
      

  7.   

    可是这是windows不可能让你有磁盘的调度算法的控制权,文件系统也不支持如此。
    所以我说lz需要自己写一个操作系统。
      

  8.   

    哦,原来是我会错意了  lhylhy抱歉哈(也就是说这个问题没什么意义啊。。)
      

  9.   

    你的问题有意义,如果你直的想提高拷贝速度,最好是参考 FastCopy 的源代码(它的速度,用 G41 板的机器 E5200 CPU ,用异盘拷贝,接主板的 SATA 口,用 5400 转的硬盘,可达到 133M/S, 是 windows 复制的一倍以上),虽然是 C 写的,但如果你看得明,一定帮助非常大. 你上 google , 可搜到相应的源代码的 
      

  10.   

    我也做过这样的程序,但我要复制的文件比较小,500K左右,5个线程比单线程快不到一倍
    我的方法和楼主的不同,我在主线程里读取列表,动态创建子线程,每个子线程只复制一个文件,完成后直接销毁,不做临界区,复制结果用sendmessage返回,
    看楼主的代码,似乎是在子线程里循环复制,这样是不是线程间复制重复了,
    我是初学者,如果分析错误还请指教
      

  11.   

    我看过下 FastCopy 的源码,用 vc 可编译通过,大致他是分为读文件线程及写文件线程,然后还有磁盘缓存(读出来的缓存),当然,还有非常低级的绝对磁盘读及绝对磁盘写,反正它的优化是非常多面的,而不是仅仅依靠线程,所以几乎可以达到磁盘 IO 所说的极限速度
      

  12.   

    绝对磁盘读写操作 这个名词我以前听说过,但在网上一直找不到好的解释,  麻烦meegowei1解释下什么是绝对磁盘读写操作吗?
      

  13.   

    你给个邮件地址我,我发 fastcopy 的源码给你,自己看吧 ...
      

  14.   

    [email protected] 多谢啊
      

  15.   

    谢谢  meegowei1 啊!
    结贴