Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   indy 10 y sincronizacion (https://www.clubdelphi.com/foros/showthread.php?t=73857)

cesarsoftware 20-05-2011 11:53:16

indy 10 y sincronizacion
 
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

Código Delphi [-]
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;


La franja horaria es GMT +2. Ahora son las 15:03:58.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi