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;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;end;