Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Оптимизация одновременной загрузки на несколько серверов в Delphi

Delphi , Интернет и Сети , FTP

Заголовок:

Вопрос: У меня есть проект загрузчика FTP, который использует форму, созданную во время выполнения, для запуска загрузки на несколько серверов FTP (с помощью Indy). Моя проблема заключается в следующем (и я действительно нуждаюсь в вашей помощи).

На форму я поставил компонент IdFTP + кнопку загрузки + общедоступные свойства FTPSrvAdrs и SrcFile + TrgFolder. Когда я нажимаю кнопку "Загрузить", процесс загрузки FTP не запускается на всех 4 экземплярах формы, а я должен ждать, пока каждая загрузка будет завершена, прежде чем запустится следующая. Я хочу, чтобы все процессы загрузки запускались одновременно, когда я нажимаю кнопку "Загрузить" на каждой форме.

Подтвержденный ответ: Вам нужно либо изменить библиотеку Indy на неблокирующую в фоновом режиме (событийную или порт завершения), либо сделать свою программу многопоточной (с своим набором проблем, таких как нажатие пользователем кнопки 20 раз или закрытие формы во время процесса или даже закрытие программы во время работы).

Ниже приведен пример кода, который демонстрирует, как можно использовать библиотеку AsyncCalls для запуска загрузки в фоновом режиме:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    btnUpload: TButton;
    btnClose: TButton;
    ftp: TIdFTP;
    procedure btnUploadClick(Sender: TObject);
    procedure btnCloseClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnUploadClick(Sender: TObject);
begin
  AsyncProcedure(Self, Procedure
    begin
      ftp.Host := 'ftp.example.com';
      ftp.Username := 'username';
      ftp.Password := 'password';
      ftp.Connect;
      ftp.Put('C:\path\to\file.txt', 'file.txt', False);
      ftp.Disconnect;
    end);
end;

procedure TForm1.btnCloseClick(Sender: TObject);
begin
  Close;
end;

end.

В этом примере, когда пользователь нажимает кнопку "Загрузить", процедура загрузки запускается в фоновом режиме с помощью функции AsyncProcedure. После завершения загрузки форма автоматически закрывается.

Альтернативный ответ: Вы также можете использовать компонент TIdSync для синхронизации доступа к ресурсам и TIdNotify для уведомления о завершении загрузки. Подробнее об этом можно прочитать в статье на StackOverflow: https://stackoverflow.com/questions/8318438/indy-ftp-failing-to-upload-miserably

Создано по материалам из источника по ссылке.

Пользователь разрабатывает загрузчик FTP в Delphi, который должен одновременно загружать файлы на несколько серверов, но вместо этого каждая загрузка запускается по очереди, что замедляет процесс. Пользователь ищет решение, чтобы запустить все з


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: FTP ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 13:36:44/0.0047399997711182/1