• 02-12-2022, 10:43:01
    #1
    Arkadaşlar merhaba;
    Belirli aralıklar ile sunucuda bulunan yedekleri başka bir ortama aktaran bir program yazdım.
    dosya sayısı 15-20 arası değişiyor ve toplam boyut 1 TB buluyor.

    Kopyalama için kullandığım kod
     
     FileMode := 0;
      ProgressBar1.Max := FileListBox1.Count;
      if FindFirst(dir + '\*.*', faAnyFile, F) = 0 then
        repeat
          try
    
            CopyFile(PChar(dir + '\' + F.Name),
              PChar(DirectoryListBox2.Directory + '\' + 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
          end;
    program kopyala işlemini gayet başarılı bir şekilde yapıyor
    Ancak kopyalama işlemi bitene kadar program cevap vermiyor. Bunu engellemenin bir yolu varmıdır.

    Bana bu konuda bir yardımı edebilirseniz sevinirim
  • 02-12-2022, 11:19:07
    #2
    Eskiden kullanırdık severdik Artık python a geçin hocam onda sorun yaşamazsınız
  • 20-12-2022, 18:12:27
    #3
    https://docwiki.embarcadero.com/RADS...amming_Library

    TTask kullanmanız lazım hocam.

    erkancaglar adlı üyeden alıntı: mesajı görüntüle
    Arkadaşlar merhaba;
    Belirli aralıklar ile sunucuda bulunan yedekleri başka bir ortama aktaran bir program yazdım.
    dosya sayısı 15-20 arası değişiyor ve toplam boyut 1 TB buluyor.

    Kopyalama için kullandığım kod
     FileMode := 0;
      ProgressBar1.Max := FileListBox1.Count;
      if FindFirst(dir + '\*.*', faAnyFile, F) = 0 then
        repeat
          try
    
            CopyFile(PChar(dir + '\' + F.Name),
              PChar(DirectoryListBox2.Directory + '\' + 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
          end;
    program kopyala işlemini gayet başarılı bir şekilde yapıyor
    Ancak kopyalama işlemi bitene kadar program cevap vermiyor. Bunu engellemenin bir yolu varmıdır.

    Bana bu konuda bir yardımı edebilirseniz sevinirim
  • 19-01-2024, 17:59:59
    #4
    Kimlik doğrulama veya yönetimden onay bekliyor.
    EvrenOnur adlı üyeden alıntı: mesajı görüntüle
    Eskiden kullanırdık severdik Artık python a geçin hocam onda sorun yaşamazsınız
    Multitasking yapılmamış. Sorun bundan kaynaklı. Program main thread'i kilitliyor. Process'in bitmesini bekliyor.

    Python'ın bellek kullanımı ve performansı ile delphi'nin yanına yaklaşamaz. Golang deseniz bir nebze olur belki ama python'un hiç şansı yok. Ayrıca güncel sürümleri takip etmiyorsanız, takip etmenizi tavsiye ederim.
    Delphi çok iyi bir dil haline getirildi ve yükselişi devam edecektir.
  • 21-01-2024, 16:22:36
    #5
    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;