我想将多个文件复制到一个文件中,但是使用多线程,假设文件A是不同线程复制数据的文件,在这种情况下,每个线程都意味着复制文件A中的一个文件,使用以下过程:
procedure ConcatenateFiles(const InFileNames: array of string;
const OutFileName: string);
var
i: Integer;
InStream, OutStream: TFileStream;
begin
OutStream := TFileStream.Create(OutFileName, fmCreate);
try
for i := 0 to high(InFileNames) do
begin
InStream := TFileStream.Create(InFileNames[i], fmOpenRead);
try
OutStream.CopyFrom(InStream, InStream.Size);
finally
InStream.Free;
end;
end;
finally
OutStream.Free;
end;
end;
首先,这种情况下是否可以实现多线程复制文件,因为OutFileName是一个全局变量,两个线程不能同时使用它,这是我得到的错误,
如果可能的话,我如何同步线程以避免同一时刻多个进程使用 OutFileName?
并且制作多线程复制文件真的很高效吗,我说的是复制文件的速度。
谢谢你的回复
使用多线程复制文件是完全可能的。您通常会使用单个生产者线程和多个消费者来完成工作。在你的情况下,你正在连接。因此,您需要计算出每个源文件的起点和终点,然后让线程在预先计算的位置写入目标文件的单独部分。当然有可能。
然而,这不是一个好主意。当作业受 CPU 限制时,多线程效果很好。文件复制受磁盘限制,没有多少额外的线程可以提供帮助。事实上,您最终可能会使性能变得更糟,因为多个线程在争夺共享磁盘资源时会互相妨碍。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)