首页 > 其他分享 >delphi多线程文件复制怎么实现

delphi多线程文件复制怎么实现

时间:2024-08-18 10:49:00浏览次数:10  
标签:begin end delphi TCopyThread 复制 procedure 多线程 FCopyThread

在Delphi中,可以使用TThread类来实现多线程文件复制。以下是一个示例代码:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TCopyThread = class(TThread)
  private
    FSourceFile: string;
    FDestFile: string;
  protected
    procedure Execute; override;
  public
    constructor Create(const SourceFile, DestFile: string);
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    FCopyThread: TCopyThread;
    procedure CopyProgress(const BytesCopied, TotalBytes: Int64);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TCopyThread.Create(const SourceFile, DestFile: string);
begin
  inherited Create(True);
  FSourceFile := SourceFile;
  FDestFile := DestFile;
end;

procedure TCopyThread.Execute;
var
  SourceStream, DestStream: TFileStream;
  Buffer: array[0..8191] of Byte;
  BytesRead, BytesWritten: Integer;
begin
  SourceStream := TFileStream.Create(FSourceFile, fmOpenRead or fmShareDenyWrite);
  try
    DestStream := TFileStream.Create(FDestFile, fmCreate);
    try
      repeat
        BytesRead := SourceStream.Read(Buffer, SizeOf(Buffer));
        if BytesRead > 0 then
        begin
          BytesWritten := DestStream.Write(Buffer, BytesRead);
          if BytesWritten <> BytesRead then
            Break;
          Synchronize(procedure
          begin
            // 更新进度显示
            Form1.CopyProgress(SourceStream.Position, SourceStream.Size);
          end);
        end;
      until BytesRead = 0;
    finally
      DestStream.Free;
    end;
  finally
    SourceStream.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if FCopyThread = nil then
  begin
    FCopyThread := TCopyThread.Create('source.txt', 'dest.txt');
    FCopyThread.FreeOnTerminate := True;
    FCopyThread.Start;
    Button1.Caption := '取消';
  end
  else
  begin
    FCopyThread.Terminate;
    FCopyThread := nil;
    Button1.Caption := '开始';
  end;
end;

procedure TForm1.CopyProgress(const BytesCopied, TotalBytes: Int64);
begin
  // 更新进度显示
  Caption := Format('Copying %d/%d bytes', [BytesCopied, TotalBytes]);
end;

end.

以上代码实现了一个简单的多线程文件复制功能。在按钮点击事件中,会创建一个TCopyThread对象并启动线程进行文件复制。在TCopyThread.Execute方法中,会使用TFileStream读取源文件内容,并写入到目标文件中。在每次写入数据后,通过Synchronize方法来在主线程中更新进度显示。

在窗体上放置一个按钮,并将按钮的OnClick事件绑定到Button1Click方法。运行程序后,点击按钮即可开始或取消文件复制操作。同时,窗体的标题栏会实时显示复制进度。

注意:在复制大文件时,可能会导致界面假死。为了避免这种情况,可以考虑在复制过程中使用进度条或者其他方式显示进度。

标签:begin,end,delphi,TCopyThread,复制,procedure,多线程,FCopyThread
From: https://www.cnblogs.com/ynmsnc/p/18365377

相关文章

  • 用输入输出流(I/O)流,递归复制和删除多级文件
    一、(I/O)流递归复制一个文件第一种:elseif语句过多,看起来冗余,优点:多级文件一次性复制完整importjava.io.*;//数据源:src/main/java/day15_8_13/haha//目标;src/main/java/LaJipublicclassDiGuiCopy{publicstaticvoidmain(String[]args)throwsException{......
  • delphi 常用控件属性设置说明
    常用DELPHI控件属性设置说明目录TFormClass TPanel组件 TToolBarClass TToolButtonClass TTimerClass TADOConnectionClass TADOQueryClass TADODataSetClass TDBGridClass TADOStoredProcClass TButtonClass TBitBtnClass TComboBoxClass TStaticText......
  • C++多线程详解 | 线程创建 | 互斥锁 | 条件变量 | 线程池
    目录前言1.线程创建2.互斥锁3.lock_guard与std::unique_lock4.condition_variable 5.线程池前言在说线程之前,先说说进程和线程的关系,以及什么是多线程(为了方便理解就用大白话来说)进程:进程就是运行中的程序,比如说一个微信的程序,你双击它,它运行起来了就是一个进程,在还......
  • 面试题:在Java中,多线程编程是常见的并发处理方式。请简述Java中实现多线程的几种主要方
    面试题:在Java中,多线程编程是常见的并发处理方式。请简述Java中实现多线程的几种主要方式,并解释每种方式的基本思想。更多关于多线程编程的深入解析、面试技巧、以及实战项目源码,手机浏览器即可访问面霸宝典【全拼音】.com,这里不仅可以优化你的简历,还能进行模拟面试,获取最新最......
  • C++编程:内存栅栏(Memory Barrier)详解及在多线程编程中的应用
    文章目录0.引言1.什么是内存栅栏?2.为什么需要内存栅栏?本质原因是什么?2.1编译器优化2.2CPU乱序执行3.ARM64和x86架构下的内存栅栏差异3.1x86架构3.2ARM64架构4.代码示例4.1代码解析4.2memory_order_release和memory_order_acquire解释4.3为什么是“releas......
  • 【MySQL】开启并行复制
    一、介绍在官方的5.6版本之前,MySQL只支持单线程复制,由此在主库并发高、TPS高时就会出现严重的主备延迟问题。如果备库执行日志的速度持续低于主库生成日志的速度,那么主从延迟就有可能成了小时级别。而且对于一个压力持续比较高的主库来说,备库很可能永远都追不上主库。1>MyS......
  • [Windows批处理]比对Git两个分支之间的差异,把有改动的文件复制到指定目录
    保存为git-diff-copy.bat@echooffREM[Windows批处理]比对Git两个分支之间的差异,把有改动的文件复制到指定目录setlocalenabledelayedexpansionREM1:设置被复制的git项目文件夹(尾部要加"\")setcopy_from=..\vue-vben-admin\REM2:设置复制的目标文件夹setcopy_to=%~dp0......
  • Delphi开发新纪元:探索持续集成与持续部署的自动化之路
    标题:“Delphi开发新纪元:探索持续集成与持续部署的自动化之路”引言在软件工程领域,持续集成(CI)和持续部署(CD)是敏捷开发的关键实践,它们确保了代码的高质量和快速迭代。对于Delphi开发者而言,选择合适的CI/CD工具对于提高开发效率和软件质量至关重要。一、DelphiCI/CD工具概......
  • 云计算实训30——mysql主从复制同步、mysql5.7版本安装配置、python操作mysql数据库、
    一、mysql主从复制及同步1、mysql主从自动开机同步2、配置mysql5.7版本mysql-5.7.44-linux-glibc2.12-x86_64.tar启动服务、登录对数据库进行基本操作3、使用python操纵mysql数据库4、编辑python脚本自动化操纵mysql数据库二、mycat读写分离......
  • 让delphi程序不受WINDOWS日期格式的影响
    如果WINDOWS系统的短日期格式为“yyyy/m/d”,执行下面的代码会报错:2013-01-2900:00:00不是合法的日期procedureTFrmQuerySale.FormShow(Sender:TObject);varsDate:string;begininherited;//默认查当天的销售数据sDate:=FormatDateTime('yyyy-mm-dd',Now);DateTimePicker1.D......