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 (внутри потока) и обработка сообщения (вне потока) были необходимы для обновления пользовательского интерфейса...