我做了个多线程复制的小工具,用的是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个线程复制用了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;
解决方案 »
- delphi到底用来干什么的啊?
- C语句ss=::SysAllocString((LPCWSTR)&byEnd); 在Delphi如何写?
- 我选用的数据库是通过ODBC来连接的,但总是要输入密码。请问,能把这个密码保存吗?
- 问一下关于帮助制作中遇到的问题。html workshop
- 请问各位大虾,没人给出解决答案,不能结帖,又怕被扣分,怎么办?(新手)
- Quickreport中关于PageFooter的问题,为什么?
- 关于鼠标(100分)
- 怎么样才能把SQL Server 服务器的时间存入表中?
- table1.prior 起什么作用?是不是相当于VFP 中的
- 救命啊!我的电脑启动不了了!kmode_exception_not_handled!我一定加到我能加的最大分数!
- FreeAndNil的问题
- 使用CopyMemory拷贝字符串的问题
就是说这样没什么意义了?
delphi是windows下的开发工具
请您认真负责地回答帖子
所以我说lz需要自己写一个操作系统。
我的方法和楼主的不同,我在主线程里读取列表,动态创建子线程,每个子线程只复制一个文件,完成后直接销毁,不做临界区,复制结果用sendmessage返回,
看楼主的代码,似乎是在子线程里循环复制,这样是不是线程间复制重复了,
我是初学者,如果分析错误还请指教
结贴