Programación multiproceso bajo DELPHI (1)
Sabemos que win95 o winNT son sistemas operativos "multiproceso". En DELPHI 2.0, podemos aprovechar al máximo esta función y escribir aplicaciones "multiproceso".
Para aquellos que escribieron programas en DOS o Windows de 16 bits en el pasado, el "subproceso múltiple" aún no les resulta familiar, pero así como pasamos de una sola tarea en DOS a la multitarea en Windows 3.1, ahora debemos hacer la transición nuevamente. Después de todo, en el campo de los "subprocesos múltiples", la era de las computadoras está en constante desarrollo. Sin embargo, afortunadamente, la programación multiproceso en DELPHI2.0 no requiere que aprendamos las enormes funciones de WIN32API. Podemos usar la clase estándar de subprocesos múltiples TThread en DELPHI para completar nuestro trabajo.
TThread es una clase abstracta, es decir, no es necesario declarar variables basadas en TThread (y las variables declaradas en base a TThread son completamente inútiles, lo que tenemos que hacer es usar TThread como clase base y generarla). la forma de herencia. De hecho, es muy fácil escribir aplicaciones multiproceso basadas en TThread.
La siguiente es una clase básica de subprocesos múltiples generada al heredar TThread.
QuerThrd. pas
unidadQuerThrd;
interfaz
usos
Clases, DBTables;
tipo
TQueryThreadΚclase(TThread)
Privado
fQuery:tQuery;
protegido
procedimientoEjecutar;anular;
público
constructorCreate(Suspended: Boolean; Consulta: TQuery);
fin;
implementación
constructor
TQueryThread. Crear(Suspendido: Booleano; Consulta: TQuery);
comenzar
heredadoCrear(Suspendido);
fQuery: ΚQuery;
FreeOnTerminate:ΚVerdadero;
fin;
procedimientoTQueryThread. Ejecutar;
comenzar
fQuery. Abierto;
fin;
fin.
En el ejemplo simple anterior, construimos una subclase TQuery-Thread de TThread para ejecutar consultas de bases de datos en segundo plano. En la función Crear de esta clase, se pasan dos parámetros Suspendido y Consulta, donde Suspendido se usa para controlar la ejecución del subproceso. Si Suspender es verdadero, el subproceso de la clase TQueryThread se suspenderá inmediatamente después de que se establezca hasta que se reanude. El método se ejecuta. El subproceso continuará ejecutándose. El parámetro Query se utiliza para aceptar un control Query existente (el control Query real en el formulario) para que se ejecute en una situación de subprocesos múltiples. La ejecución es el proceso más importante. Es la parte de ejecución de la clase TQueryThread. Todas las declaraciones que deben ejecutarse en esta clase multiproceso deben escribirse en este proceso.
De hecho, al construir su propia clase multiproceso, no necesita ingresar todos estos códigos. Seleccione la nueva opción en el menú Archivo de DELPHI, luego seleccione el proyecto "TThreadObject" y DELPHI construirá el módulo de programa básico por usted. Luego podemos hacer las modificaciones correspondientes según sea necesario.
Ejecución del proceso:
Supongamos que hemos creado un formulario FORM1, que contiene el control de consulta Query1 que vamos a utilizar. Luego agregamos la unidad QuerThrd escrita arriba a la parte USES de la unidad.
procedimientoTForm1. Botón1Clic(Remitente: TObject);
comenzar
{Crear un proceso en ejecución}
TQueryThread. Crear (Falso, Consulta1);
fin;
Si se ejecuta este proceso, el control de consulta Consulta1 en el formulario ejecutará automáticamente la consulta en un entorno de subprocesos múltiples. Tenga en cuenta que solo existe Create pero no Free en la clase TQueryThread. Después de crear dinámicamente una clase y luego olvidarnos de eliminarla, es uno de los errores que cometemos a menudo, ya que hemos especificado FreeOnTerminate (eliminar después de ejecutar) como verdadero. Aquí, cuando se ejecuta la declaración en Ejecutar Después de completar, el control de memoria ocupado por la clase TQueryThread se liberará automáticamente.
Sin embargo, hay otro problema que merece nuestra atención. Dado que se pueden ejecutar varios subprocesos al mismo tiempo, también debemos resolver el problema de sincronización. Si no hay correlación entre varios programas de subprocesos múltiples, no habrá correlación entre ellos. cualquier conflicto. Pero, de hecho, es posible que se estén ejecutando varias aplicaciones de bases de datos multiproceso al mismo tiempo. Dado que es necesario compartir los mismos recursos de la base de datos, también debemos agregar un control Tsession a Query1.
De hecho, aunque es posible que no hayamos utilizado personalmente el control de sesión, DELPHI creará automáticamente un control de sesión temporal durante todos los accesos a la base de datos y lo eliminará dinámicamente después de su uso. En la programación normal de bases de datos, no necesitamos hacerlo nosotros mismos, pero en el caso de la ejecución multiproceso de la base de datos, para no entrar en conflicto entre sí, debemos personalizar nuestro propio control de sesión para cada acceso a la base de datos. Este paso es muy simple. Solo necesitamos agregar un control de sesión al formulario, luego escribir un nombre arbitrario en su propiedad "Nombre de sesión" y luego escribir el mismo nombre en el "Nombre de sesión" de Consulta1. De esta manera nuestro programa de base de datos está seguro.
Otro tipo de problema de sincronización que debe resolverse son los programas que operan con recursos VCL. Hay muchos programas de este tipo, pero afortunadamente la solución también es muy sencilla.
Podemos mirar un programa como este:
unidadBncThrd;
interfaz
usos
WinProcs, Clases, Gráficos, ExtCtrls;
tipo
TBounceThreadΚclase(TThread)
privado
Forma F: Forma T;
FXSpeed: entero;
FYSpeed: Entero;
procedimientoMoveShape;
protegido
procedimientoEjecutar;anular;
público
constructorCreate(Suspended: Boolean; Shape: TShape; XSpeed, YSpeed: Integer);
propiedadForma: TShapereadFShape;
fin;
implementación
procedimiento TBouad. MoverForma;
var
MaxHeight, MaxWidth: entero;
comenzar
conFShapedo
comenzar
Izquierda: ΚIzquierda+FXSpeed;
Arriba: ΚTop+FYSpeed;
si (IzquierdaΙ0) o
(Izquierda+AnchoΛPadre.Ancho)luego
Velocidad FX: ΚVelocidad FX*-1;
si (TopΙ0) o
(Superior+AlturaΛParent.Altura)luego
FYSpeed: ΚFYSpeed*-1;
Blog del autor: http://blog.csdn.net/zou5655/