Clase de hilo en Delphi
Raptor[Estudio mental]
http://mental.mentsu.com
(uno)
Hay una clase de subproceso TThread en Delphi que se utiliza para implementar la programación de subprocesos múltiples. La mayoría de los libros de Delphi mencionan esto, pero básicamente dan una breve introducción a varios miembros de la clase TThread y luego explican la función Ejecutar. de Sincronizar están completos. Sin embargo, esto no es todo sobre la programación multiproceso. El propósito de escribir este artículo es complementarlo.
Un hilo es esencialmente un fragmento de código que se ejecuta simultáneamente en un proceso. Un proceso tiene al menos un hilo, el llamado hilo principal. También puede haber varios subprocesos al mismo tiempo. Cuando se utiliza más de un subproceso en un proceso, se denomina "multiproceso".
Entonces, ¿cómo se define este llamado "pedazo de código"? De hecho, es una función o proceso (para Delphi).
Si utiliza la API de Windows para crear un hilo, se implementa a través de una función API llamada CreateThread, que se define como:
MANEJAR Crear hilo (
LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWord dwStackSize,
LPTHREAD_START_ROUTINE lpDirección de inicio,
LPVOID lpParámetro,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
Los parámetros son como lo dicen sus nombres: atributos de subproceso (usados para establecer atributos de seguridad de subprocesos en NT, no válidos en 9X), tamaño de pila, dirección inicial, parámetros, indicador de creación (usado para establecer el estado del subproceso cuando se crea), ID del subproceso y finalmente devuelve el hilo Handle. La dirección inicial es la entrada a la función del hilo. Hasta que finaliza la función del hilo, el hilo termina.
El proceso de ejecución de todo el hilo es el siguiente:
Debido a que CreateThread tiene muchos parámetros y es una API de Windows, se proporciona una función de subproceso general en la biblioteca C Runtime (teóricamente se puede usar en cualquier sistema operativo que admita subprocesos):
unsigned long _beginthread(void (_USERENTRY *__start)(void *), unsigned __stksize, void *__arg);
Delphi también proporciona una función similar con la misma funcionalidad:
función BeginThread(SecurityAttributes: Puntero; StackSize: LongWord; ThreadFunc: TThreadFunc; Parámetro: Puntero; CreationFlags: LongWord; var ThreadId: LongWord): Entero;
Las funciones de estas tres funciones son básicamente las mismas. Todas colocan el código de la función del hilo en un hilo independiente para su ejecución. La mayor diferencia entre las funciones de subproceso y las funciones generales es que tan pronto como se inicia la función de subproceso, las tres funciones de inicio de subproceso regresan. El subproceso principal continúa ejecutándose hacia abajo, mientras que la función de subproceso se ejecuta en un subproceso independiente. ¿Tardará en ejecutarse? Cuando regresa, al hilo principal no le importa y no lo sabe.
En circunstancias normales, después de que regresa la función del hilo, el hilo finaliza. Pero hay otras formas:
API de Windows:
VOID ExitThread(DWORD dwExitCode);
Biblioteca de tiempo de ejecución C:
vacío _endthread(vacío);
Biblioteca de tiempo de ejecución de Delphi:
Procedimiento EndThread(Código de salida: entero);
Para registrar algunos datos necesarios del hilo (estado/propiedades, etc.), el sistema operativo creará un objeto interno para el hilo. Por ejemplo, en Windows, el identificador es el identificador de este objeto interno, por lo que este objeto debe liberarse. cuando termina el hilo.
Aunque la programación multiproceso se puede realizar fácilmente utilizando API o RTL (Biblioteca de tiempo de ejecución), aún se requiere un procesamiento más detallado. Por esta razón, Delphi ha realizado una mejor encapsulación de los subprocesos en la unidad Clases. Esta es la clase de subproceso VCL: TThread.
Usar esta clase también es muy simple. La mayoría de los libros de Delphi dicen que el uso básico es: primero derivar su propia clase de hilo de TThread (porque TThread es una clase abstracta y no puede generar instancias) y luego usar el método abstracto Override: Ejecutar (Esto). es la función del hilo, que es la parte del código ejecutada en el hilo). Si necesita utilizar el objeto visual VCL, debe hacerlo a través del proceso Sincronizar. Para obtener detalles específicos, no entraremos en detalles aquí. Consulte los libros relevantes.
Lo siguiente que discutirá este artículo es cómo la clase TThread encapsula subprocesos, es decir, un estudio en profundidad de la implementación de la clase TThread. Porque sólo entendiéndolo verdaderamente podremos utilizarlo mejor.
La siguiente es la declaración de la clase TThread en DELPHI7 (este artículo solo analiza la implementación en la plataforma Windows, por lo que se ha eliminado todo el código relacionado con la plataforma Linux):
TThread = clase
privado
Mango F: Mango T;
FThreadID: THandle;
FCreateSuspended: booleano;
FTerminado: booleano;
FSuspendido: booleano;
FFreeOnTerminate: booleano;
Fterminado: booleano;
FReturnValue: Entero;
FOnTerminate: TNotifyEvent;
FSynchronize: TSynchronizeRecord;
FFatalException: TObject;
procedimiento CallOnTerminate;
procedimiento de clase Synchronize(ASyncRec: PSSynchronizeRecord);
función GetPriority: TThreadPriority;
procedimiento SetPriority(Valor: TThreadPriority);
procedimiento SetSuspended(Valor: booleano);
protegido
procedimiento CheckThreadError(ErrCode: Integer);
procedimiento CheckThreadError(Éxito: sobrecarga booleana);
procedimiento DoTerminate;
procedimiento Ejecutar; virtual; resumen;
procedimiento Sincronizar (Método: TThreadMethod);
propiedad ReturnValue: entero leído FReturnValue escribir FReturnValue;
propiedad Terminada: lectura booleana FTerminada;
público
constructor Crear(CreateSuspended: Booleano);
destructor Destruir; anular;
procedimiento AfterConstruction;
procedimiento Currículum;
procedimientoSuspender;
procedimiento Terminar;
función WaitFor: LongWord;
procedimiento de clase Sincronizar (AThread: TThread; AMethod: TThreadMethod sobrecarga);
procedimiento de clase StaticSynchronize(AThread: TThread; AMethod: TThreadMethod);
propiedad FatalException: TObject lee FFatalException;
propiedad FreeOnTerminate: lectura booleana FFreeOnTerminate escritura FFreeOnTerminate;
identificador de propiedad: THandle lee FHandle;
propiedad Prioridad: TThreadPriority leer GetPriority escribir SetPriority;
propiedad Suspendida: lectura booleana FSuspended escritura SetSuspended;
propiedad ThreadID: THandle lee FThreadID;
propiedad OnTerminate: TNotifyEvent lee FOnTerminate escribe FOnTerminate;
fin;
La clase TThread es una clase relativamente simple en RTL de Delphi. No hay muchos miembros de clase y los atributos de clase son muy simples y claros. Este artículo solo realizará un análisis detallado de algunos métodos de miembros de clase más importantes y el único evento: OnTerminate. .
(continuará)