Consultas de bases de datos Delphi multiproceso

Por diseño, una aplicación Delphi se ejecuta en un hilo. Para acelerar algunas partes de la aplicación, es posible que desee agregar varias rutas simultáneas de ejecución en su aplicación Delphi.

Multithreading en aplicaciones de bases de datos

En la mayoría de los escenarios, las aplicaciones de base de datos que crea con Delphi son de un solo subproceso: una consulta que ejecuta contra la base de datos debe finalizar (procesamiento de los resultados de la consulta) antes de que pueda obtener otro conjunto de datos.

Para acelerar el procesamiento de datos, por ejemplo, obtener datos de la base de datos para crear informes, puede agregar un hilo adicional para obtener y operar en el resultado (conjunto de registros).

Continúe leyendo para obtener información sobre las 3 trampas en consultas de bases de datos ADO multiproceso:

  1. Resuelve: "CoInitialize no fue llamado".
  2. Resuelve: "El lienzo no permite dibujar".
  3. Main TADoConnection no se puede usar!

Escenario de pedido del cliente

En el conocido escenario en el que un cliente realiza pedidos que contienen artículos, es posible que deba mostrar todos los pedidos de un cliente en particular junto con el número total de artículos por cada pedido.

En una aplicación de subproceso único "normal", necesitaría ejecutar la consulta para obtener los datos y luego iterar sobre el conjunto de registros para mostrar los datos.

Si desea ejecutar esta operación para más de un cliente, debe ejecutar secuencialmente el procedimiento para cada uno de los clientes seleccionados.

en un escenario multiproceso puede ejecutar la consulta de base de datos para cada cliente seleccionado en un hilo separado-y así hacer que el código se ejecute varias veces más rápido.

Multithreading en dbGO (ADO)

Supongamos que desea mostrar los pedidos de 3 clientes seleccionados en un control de cuadro de lista de Delphi.

 tipo

   TCalcThread = clase(TThread)

  
privado

     procedimiento RefreshCount;

  
protegido

     procedimiento Ejecutar; anular;

  
público

     ConnStr: cadena ancha;

     SQLString: cadena ancha;

     ListBox: TListBox;

     Prioridad: TThreadPriority;

     TicksLabel: TLabel;

 

     Garrapatas: Cardenal;

   final;

Esta es la parte de la interfaz de una clase de subproceso personalizado que vamos a utilizar para obtener y operar todos los pedidos de un cliente seleccionado.

Cada pedido se muestra como un elemento en un control de cuadro de lista (Cuadro de lista campo). los ConnStr campo contiene la cadena de conexión ADO. los TicksLabel contiene una referencia a un control TLabel que se usará para mostrar los tiempos de ejecución de subprocesos en un procedimiento sincronizado.

los RunThread El procedimiento crea y ejecuta una instancia de la clase de subproceso TCalcThread.

 función TADOThreadedForm.RunThread (SQLString: widetring; LB: TListBox; Priority: TThreadPriority; lbl: TLabel): TCalcThread;

var

   CalcThread: TCalcThread;

 empezar

   CalcThread: = TCalcThread.Create (verdadero);

   CalcThread.FreeOnTerminate: = verdadero;

   CalcThread.ConnStr: = ADOConnection1.ConnectionString;

   CalcThread.SQLString: = SQLString;

   CalcThread.ListBox: = LB;

   CalcThread.Priority: = Prioridad;

   CalcThread.TicksLabel: = lbl;

   CalcThread.OnTerminate: = ThreadTerminated;

   CalcThread.Resume;

 

   Resultado: = CalcThread;

 final;