Merhabalar Delphi dilini bilmem ama yardımı dokunacaksa söyle birşey deneyebilirsiiniz. ( konudaki kod bloğuna göre yorum ve açıklama )

Yaşadığınız donma sorunu, dosya kopyalama işlemlerinin bir döngü içinde sırayla yapılıyor olmasıyla ilgili olabilir. Döngünün her bir yinelemesi sırasında, uygulama bir sonraki dosyaya geçmeden önce CopyFile işlevinin tamamlanmasını bekliyor olabilir. Bu durum, özellikle çok sayıda dosya varsa veya kopyalama işlemi önemli miktarda zaman alıyorsa, uygulamanızın yanıt vermemesine neden olabilir.

Kullanıcı arayüzünün donmasını önlemek için, dosya kopyalama işlemlerini eşzamansız olarak gerçekleştirmeli ve böylece kopyalama işlemi sırasında uygulamanın yanıt vermeye devam etmesini sağlamalısınız. Bunu başarmanın bir yolu iş parçacıkları kullanmaktır. İşte Delphi'deki TThread sınıfını kullanan basitleştirilmiş bir örnek:


procedure TCopyFilesThread.Execute;
var
  F: TSearchRec;
begin
  try
    if FindFirst(FSourceDirectory + '\*.*', faAnyFile, F) = 0 then
    begin
      repeat
        Synchronize(
          procedure
          begin
            try
              CopyFile(PChar(FSourceDirectory + '\' + F.Name),
                PChar(FDestinationDirectory + '\' + F.Name), True);
              Memo1.Lines.Add(F.Name + '-' + IntToStr(F.Size) + '-' +
                DateTimeToStr(F.TimeStamp));
              WriteToLog(F.Name + '-' + IntToStr(F.Size) + '-' +
                DateTimeToStr(F.TimeStamp));
              Memo1.Lines.Add(YedekDetayKaydet(DateToStr(DateTimePicker1.Date),
                F.Name, RadioGroup1.Items[RadioGroup1.ItemIndex],
                DateTimeToStr(F.TimeStamp), IntToStr(F.Size)));
              ProgressBar1.StepBy(1);
            except
              on E: Exception do
                // Handle exceptions here if needed
            end;
          end);
      until FindNext(F) <> 0;
    end;
  finally
    FindClose(F);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Create and start the thread
  FCopyFilesThread := TCopyFilesThread.Create(True);
  FCopyFilesThread.FreeOnTerminate := True;
  FCopyFilesThread.Priority := tpNormal;
  FCopyFilesThread.Resume;
end;