【发布时间】:2014-06-06 08:18:14
【问题描述】:
我想在一个文件中复制多个文件,但是使用多线程,假设文件 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;
结束;
首先,在这种情况下是否可以实现多线程复制文件,因为OutFileName是一个全局变量,两个线程不能同时使用它,这是我得到的错误, 如果这是可能的,我如何同步线程以避免同时多个进程使用 OutFileName? 而且制作多线程复制文件真的有效率吗,我说的是复制文件的速度。 感谢您的回复
【问题讨论】:
-
如果你要连接一大堆文件——从多个文件创建一个文件——那么你不想用多个线程来做这件事,因为数据会交错。如果您正在谈论同时从多个线程调用
ConcatenateFiles函数,那应该是可能的。但是请注意,这样做可能会减慢您的应用程序的速度。如果所有磁盘访问都在一个驱动器上,那么多线程复制操作没有任何好处。 -
@JimMischel 我想您可以通过预先分配文件的大小然后写入文件的特定部分来并行进行一个连接。但它不会提高性能。
-
如果您还没有,您可能会得到一份 RichCopy 实用程序的副本。它使您能够调整用于各种事情(例如文件读取和写入)的线程数,并且对于哪些有帮助,哪些没有帮助非常有指导意义。特别是更多的线程更快的性能(必然) - 你仍然坚持物理定律。
标签: multithreading file delphi synchronization copy