PDA

Ver la Versión Completa : indy 10 y sincronizacion


cesarsoftware
20-05-2011, 11:53:16
Hola compis. Tengo un componente idftpserver y un lisbox donde pretendo mostrar su estado (conectado, login, etc). Se que no debo meter nada en el lisbox dentro de los metodos del idftpserver porque puedo provocar un "access violation" o algo peor. Necesito sincronizar como se hace en los thread normales pero no veo la forma (ya he buscado en los foros, en la red, en el manual, etc)
He encontrado este codigo pero es de indy 9 y no se como pasarlo a indy 10, vamos que no encuentro el metodo syncronize en el tIdContext o como indicar su thread.
Espero que puedan ayudarme. Gracias


uses IdThread;
type
TSrvSynchListBox = class
private
FText: string;
procedure VCLUpdate;
public
procedure Sync(AThread: TIdThread; AMethod: TThreadMethod; s: string);
end;
procedure TSrvSynchListBox.Sync(AThread: TIdThread; AMethod: TThreadMethod; s: string);
begin
FText := s;
AThread.Synchronize(AMethod);
end;
procedure TSrvSynchListBox.VCLUpdate;
begin
TFormFTPServer.LBftpServer.ItemIndex := TFormFTPServer.LBftpServer.Items.Add(FText);
end;
// y su uso
procedure TFormFTPserver.IdFTPServerConnect(AContext: TIdContext);
var
s: string;
begin
s := 'Conectado con ' + AContext.Binding.PeerIP + ':' +
IntToStr(Acontext.Binding.PeerPort);
// LBftpServer.ItemIndex := LBftpServer.Items.Add(s); // esto no lo debo hacer
with TSrvSynchListBox.Create do
try
Sync(AContext, VCLUpdate, s); // aqui debo conseguir el thread del TIdContext
finally
Free;
end;
end;

Delfino
20-05-2011, 13:54:07
Las Indy ya tienen sus propias clases para sincronizar. Mira en la ayuda las clases TIdSync y TIdNotify..

cesarsoftware
24-05-2011, 10:31:36
Gracias Delfino.
Ya las he implementado aunque ya he descubierto que tienen sus "cosillas" porque ha veces con formularios dinamicos (o no) tambien da algun "access violation" pero parece que "mejor controlados".
Pongo un ejemplo para el que lo necesite.

Uses IdSync. // necesario

// definir clase
type
TLogSync = class(TIdSync)
protected
s: string;
procedure DoSynchronize; override;
public
procedure Write(const texto: string);
end;

// Sincronizacion
procedure TLogSync.DoSynchronize;
begin
try
FormMain.ListBox1.Items.Add(s);
except
on e: Exception do
Exit;
end;
end;

procedure TLogSync.Write(const texto: string);
begin
s := texto;
Synchronize;
end;

// uso
procedure TFormMain.IdTCPServerLog(msg: string);
var
LogSync: TLogSync;
begin
LogSync := TLogSync.Create;
LogSync.Write(msg);
LogSync.Free;
end;