INDY 10 TCP-сервер - в сочетании с не-потокобезопасным кодом VCL

VCL не является потокобезопасным. Поэтому я думаю, что не очень хорошая идея записывать информацию в графический интерфейс в INDY 10 TCP server.execute(...) функция

Как отправить информацию с сервера выполнения в VCL?

Мне нужно изменить TBitmap внутри tcpserver.execute функция. Как сделать этот поток безопасным?

3 ответа

Решение

Записывать материал в поток VCL из Indy таким же образом, чтобы записывать материал в поток VCL из любого другого места. Общие варианты включают TThread.Synchronize а также TThread.Queue,

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

Лучший способ синхронизации - создание и использование потомка TidNotify.

определите потомок tidnotify и vcl proc с соответствующими частными полями.

TVclProc= procedure(aBMP: TBitmap) of object;

TBmpNotify = class(TIdNotify)
protected
  FBMP: TBitmap;
  FProc: TVclProc;
  procedure DoNotify; override;
public
  constructor Create(aBMP: TBitmap; aProc: TVclProc); reintroduce;
  class procedure NewBMP(aBMP: TBitmap; aProc: TVclProc);
end;

затем реализовать это так

{ TBmpNotify }

constructor TBmpNotify.Create(aBMP: TBitmap; aProc: TVclProc);
begin
  inherited Create;
  FBMP:= aBMP;
  FProc:= aProc;
end;

procedure TBmpNotify.DoNotify;
begin
  inherited;
  FProc(FBMP);
end;

class procedure TBmpNotify.NewBMP(aBMP: TBitmap; aProc: TVclProc);
begin
  with Create(aBMP, aProc) do
  begin
    Notify;
  end;

end;

затем из

server.execute(...)

называть это так

procedure TTCPServer.DoExecute(aContext: TIdContext);
var
  NewBMP: TBitmap;
begin
  TBmpNotify.NewBMP(NewBMP, FVclBmpProc);  
end;

Где FVclBmpProc - это закрытое поле, указывающее на процедуру в форме, которая соответствует сигнатуре параметра TVclProc. Это поле должно быть установлено через свойство объекта сервера сразу после создания и перед запуском сервера.

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

Одно простое сообщение PostMessage (внутри потока) и обработка сообщения (вне потока) были необходимы для обновления пользовательского интерфейса...

Другие вопросы по тегам