Ver Mensaje Individual
  #2  
Antiguo 03-06-2010
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.941
Reputación: 27
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
La VCL (asi como la mayoria de los toolkits graficos) no es thread-safe.

Osea, que no se puede garantizar el uso de controles VCL dentro de threads. Ademas, que realmente no es una buena idea

Lo que normalmente se hace es que ejecutas la parte *no visual* en un thread aparte y cuando obtienes los resultados, notificas al thread primario (osea, a la parte grafica) del resultado y procedes tal cual.

Para www.bestsellerapp.com queria ponerle la funcionalidad de detectar una nueva version sin obstruir al usuario o interrumpir las ejecuciones (bestseller tiene una parte que corre en el iPhone y un servidor Web hecho con RemObjects que corre en PC/OSX).

Busca en Google "delphi threads" para que te empapes bien. Es bueno que leas un rato ANTES de hacer nada. Este es de los temas que realmente saca canas...

Asi que necesitaba chequear la version en el servidor web y notificar si habia o no una actualizacion. Te paso lo que tengo hasta ahora pa que te des una idea:

1. Debes crear una clase que administre la ejecucion de la tarea dentro del thread. En mi caso, property Return es el dato que estoy esperando a que ejecute:

Código Delphi [-]
type
  TCheckUpdate = class(TThread)
  private
    FReturn: integer;
  protected
    procedure Execute; override;
  public
    property Return: integer read FReturn write FReturn;
  end;

Y debes implementar el EXECUTE, almacenando (de ser necesario) el resultado del calculo o proceso:

Código Delphi [-]
procedure TCheckUpdate.Execute;
var
  App: TAppConfig;
begin
  inherited;
  App := TAppConfig.Create;
  Return := 0;

  if App.UpdateAvailable then
  begin
    Return := 1;
  end else begin
    Return := 2;
  end;//if
end;

En algun lado, debes crear el thread y ponerlo a correr...
Piensa en el thread como un proceso "background":
Código Delphi [-]
procedure TfrmMain.actCheckUpdateExecute(Sender: TObject);
var
  NewThread: TCheckUpdate;
begin
  NewThread := TCheckUpdate.Create(True);
  NewThread.FreeOnTerminate := True;
  NewThread.OnTerminate := HandleTerminate;

  NewThread.Resume;

3. Un metodo donde recibes los resultados que esperabas:
Código Delphi [-]
procedure TfrmMain.HandleTerminate(Sender: TObject);
begin
  LogMsg('Cheking for new version..');
  if (Sender as TCheckUpdate).Return=1 then
  begin
    btnUpdate.Action := actUpdateServer;
    LogMsg('New version available. Please update the server');
  end else begin
    btnUpdate.Action := actUptoDate;
    LogMsg('Server is up to date!');
  end;//if
end;
__________________
El malabarista.
Responder Con Cita