Sí, se declara un nuevo tipo que hereda de TThread:
TMyWorkerThread = class(TThread)
end;
a continuación, agregar una anulación de la función de Ejecutar():
TMyWorkerThread = class(TThread)
public
procedure Execute; override;
end;
Este procedimiento se llamará cuando se inicia el hilo. Se ejecutará en paralelo con su programa principal. Vamos a escribirlo.
procedure TMyWorkerThread.Execute;
begin
//Here we do work
DoSomeWork();
DoMoreWork();
//When we exit the procedure, the thread ends.
//So we don't exit until we're done.
end;
¿Cómo utilizar esto? Supongamos que desea comenzar a trabajar cuando el usuario hace clic en el botón. Usted escribe un controlador OnClick:
procedure TMainForm.Button1Click(Sender: TObject);
begin
TMyWorkerThread.Create(false);
end;
Eso es todo. Después de que el usuario haga clic en el botón, el hilo comienza y continúa haciendo lo que sea que haya escrito en Ejecutar. Si el usuario vuelve a hacer clic en el botón, se iniciará otro, y luego otro, uno por cada clic. Todos se ejecutarán en paralelo, cada uno haciendo todo lo que está escrito en Execute() y luego terminando.
Digamos que desea comprobar si el trabajo ha finalizado. Por eso, usted tiene que almacenar la referencia a su hilo de alguna parte:
TMainForm = class(TForm)
{...skipped...}
public
MyWorkerThread: TThread;
end;
procedure TMainForm.Button1Click(Sender: TObject);
begin
//This time we make sure only one thread can be started.
//If one thread have been started already, we don't start another.
if MyWorkerThread<>nil then
raise Exception.Create('One thread have already been started!');
MyWorkerThread := TMyWorkerThread.Create(false);
end;
procedure TMainForm.Button2Click(Sender: TObject);
begin
//If the work is not over yet, we display message informing the user we're still working
if (MyWorkerThread<>nil) and (WaitForSingleObject(MyWorkerThread.Handle, 0)<>WAIT_OBJECT_0) then
MessageBox(Self.Handle, pchar("The work is not yet done!"), pchar("Still running"), MB_OK);
end;
Como se ve, estamos comprobando si un hilo sigue corriendo llamando a una función de Windows llamada WaitForSingleObject. Esta función espera hasta que el hilo termine de funcionar, o el tiempo de espera haya expirado, y cuando especificamos el tiempo de espera de 0, simplemente existe inmediatamente si el hilo no se ha terminado aún.
Ha intentado muchas muestras y ha fallado. Entonces, ¿qué le daría otro ejemplo? Debería hacer una pregunta más detallada. ¿Con qué tienes problema? Por cierto, este tutorial se ve bien: http://wiki.lazarus.freepascal.org/Multithreaded_Application_Tutorial – adf88
Y una más, a veces es una mejor solución (porque es más simple) solo para llamar a Application.ProcessMessages de vez en cuando dentro de su proceso que consume mucho tiempo (por ejemplo, solo para actualizar alguna barra de progreso o reproducir alguna otra animación que muestre al usuario que la aplicación está ocupada). – adf88
HI, adf88, estoy totalmente de acuerdo con usted. Pero el problema con las muestras es que realmente no entiendo todo sobre Thread, así que pensé que una muestra Simple podría dejar las cosas más claras para mí. De cualquier forma, resolví el problema con Application.Processmessages, Thanks –