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

Исправление замерзания формы при передаче файлов через TCP/IP в Delphi 2010

Delphi , Компоненты и Классы , Потоки

При передаче файлов через TCP/IP на клиентской и серверной стороне в Delphi 2010 может возникнуть проблема замерзания формы, если соединение прерывается на некоторое время. Это связано с тем, что все операции, связанные с отправкой и приемом файлов, выполняются в основном потоке пользовательского интерфейса, что приводит к блокировке всех событий UI.

Клиентская сторона

Код клиента, который отправляет файл, выглядит следующим образом:

procedure TForm17.BtnSendFile(Sender: TObject);
var
  FS: TFileStream;
  filename: string;
begin
  filename := 'temp.jpg';
  FS := TFileStream.Create(filename, fmOpenRead or fmShareDenyWrite);
  try
    Form1.IdTCPClient1.Socket.LargeStream := True;
    Form1.IdTCPClient1.Socket.WriteLn('PIC');
    Form1.IdTCPClient1.Socket.Write(FS, 0, True);
  finally
    FS.Free;
  end;
end;

Чтобы избежать замерзания формы, необходимо перенести операцию отправки файла в отдельный поток. Это можно сделать, используя встроенные возможности Delphi для работы с потоками или компоненты, такие как TIdThreadComponent, предоставляемые Indy.

Серверная сторона

Сервер принимает файл следующим образом:

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  S, filename: string;
  FS: TFileStream;
  Jpg: TJpegImage;
begin
  S := AContext.Connection.Socket.ReadLn;
  if S = 'PIC' then
  begin
    filename := ExtractFilePath(Application.ExeName) + 'PIC\' + FormatDateTime('"PIC_"mm"-"dd"-"yyyy" "hh"_"nn"_"ss".jpg"', Now);
    FS := TFileStream.Create(filename, fmCreate);
    try
      AContext.Connection.Socket.LargeStream := True;
      AContext.Connection.Socket.ReadStream(FS);
      FS.Position := 0;
      Jpg := TJpegImage.Create;
      try
        Jpg.LoadFromStream(FS);
        TThread.Synchronize(nil,
          procedure
          begin
            Form26.Image1.Picture.Assign(Jpg);
            Form26.Show;
          end;
        );
      finally
        Jpg.Free;
      end;
    finally
      FS.Free;
    end;
    // Отправка подтверждения о получении файла
    AContext.Connection.Socket.WriteLn('PICOK');
  end;
end;

Важно, что операции, изменяющие интерфейс пользователя, должны выполняться в основном потоке. В данном случае, использование TThread.Synchronize позволяет безопасно обновить интерфейс.

Решение проблемы

Для исправления замерзания формы необходимо отделить операцию отправки файла от основного потока UI. Это можно сделать, создав новый поток и перенеся в него код отправки файла. Например, можно использовать компонент TIdThreadComponent, предоставляемый Indy, или стандартные средства Delphi для работы с потоками.

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

Альтернативные подходы

Если использование TIdAntifreeze не помогло, можно рассмотреть следующие альтернативы:

  • Использовать TIdThreadComponent для выполнения операций в фоновом потоке.
  • Использовать TThread или TTask из стандартных возможностей Delphi для создания и управления потоками.
  • Применить класс TMyNotify, который позволяет обработать получение изображения в основном потоке UI.

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

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

Проблема заключается в том, что при передаче файлов через TCP/IP в среде Delphi 2010 происходит замерзание формы, так как операции с файлами выполняются в основном потоке пользовательского интерфейса, что приводит к блокировке всех событий UI, особенно е


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

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




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


:: Главная :: Потоки ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-01-13 18:58:42/0.0050950050354004/1