Multithreaded Delphi-databasfrågor

Genom design körs en Delphi-applikation i en tråd. För att påskynda vissa delar av applikationen kanske du vill välja att lägga till flera samtidiga körningsvägar i din Delphi-applikation.

Multitrådning i databasapplikationer

I de flesta scenarier är databasapplikationer som du skapar med Delphi entrådiga - en fråga som du kör mot databasen måste slutföras (bearbetning av sökresultaten) innan du kan hämta en annan uppsättning data.

För att påskynda databehandlingen, till exempel att hämta data från databasen för att skapa rapporter, kan du lägga till en ytterligare tråd för att hämta och använda resultatet (postuppsättning).

Fortsätt läsa för att lära dig om de 3 fällorna i ADO-databasfrågor med flera trådar:

  1. Lösa: "CoInitialize kallades inte".
  2. Lösa: "Canvas tillåter inte ritning".
  3. Main TADoConnection kan inte användas!

Kundorder Scenario

I det välkända scenariot där en kund placerar beställningar som innehåller artiklar kan du behöva visa alla beställningar för en viss kund längs det totala antalet artiklar per beställning.

I en "normal" enkeltrådad applikation skulle du behöva köra frågan för att hämta data och sedan iterera över inspelningen för att visa data.

Om du vill köra den här operationen för mer än en kund måste du göra det kör sekventiellt proceduren för var och en av de valda kunderna.

I en multitrådat scenario kan du köra databasfrågan för varje utvald kund i en separat tråd-och så att koden körs flera gånger snabbare.

Multitrådning i dbGO (ADO)

Låt oss säga att du vill visa beställningar för 3 utvalda kunder i en Delphi-listruta-kontroll.

 typ

   TCalcThread = klass(TThread)

  
privat

     procedur RefreshCount;

  
skyddade

     procedur Kör; åsidosätta;

  
offentlig

     ConnStr: bredastring;

     SQLString: bredastring;

     ListBox: TListBox;

     Prioritet: TThreadPriority;

     TicksLabel: TLabel;

 

     Fästingar: kardinal;

   slutet;

Detta är gränssnittsdelen i en anpassad trådklass som vi ska använda för att hämta och hantera alla beställningar för en utvald kund.

Varje beställning visas som ett objekt i en listrutskontroll (listruta fält). De ConnStr fältet innehåller ADO-anslutningssträngen. De TicksLabel har en referens till en TLabel-kontroll som kommer att användas för att visa trådkörningstider i en synkroniserad procedur.

De RunThread proceduren skapar och kör en instans av trådklassen TCalcThread.

 fungera TADOThreadedForm.RunThread (SQLString: widestring; LB: TListBox; Prioritet: TThreadPriority; lbl: TLabel): TCalcThread;

var

   CalcThread: TCalcThread;

 Börja

   CalcThread: = TCalcThread.Create (true);

   CalcThread.FreeOnTerminate: = true;

   CalcThread.ConnStr: = ADOConnection1.ConnectionString;

   CalcThread.SQLString: = SQLString;

   CalcThread.ListBox: = LB;

   CalcThread.Priority: = Prioritet;

   CalcThread.TicksLabel: = lbl;

   CalcThread.OnTerminate: = ThreadTerminated;

   CalcThread.Resume;

 

   Resultat: = CalcThread;

 slutet;