INDY 10 TCP Server - объединить с небезопасным кодом VCL

VCL не является потокобезопасным. Поэтому я думаю, что не стоит писать информацию в gui в функции 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;

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

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


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

licensed under cc by-sa 3.0 with attribution.