Multithreaded Delphi-databasequery's

Het ontwerp van een Delphi-toepassing wordt in één thread uitgevoerd. Om sommige delen van de applicatie te versnellen, wilt u misschien beslissen om meerdere gelijktijdige uitvoeringspaden toe te voegen aan uw Delphi-applicatie.

Multithreading in database-applicaties

In de meeste scenario's zijn database-applicaties die u maakt met Delphi single threaded - een query die u uitvoert op de database moet worden voltooid (verwerking van de queryresultaten) voordat u een andere set gegevens kunt ophalen.

Om gegevensverwerking te versnellen, bijvoorbeeld het ophalen van gegevens uit de database om rapporten te maken, kunt u een extra thread toevoegen om het resultaat op te halen en te bewerken (recordset).

Lees verder om meer te weten te komen over de 3 vallen in multithreaded ADO-databasequery's:

  1. Oplossen: "CoInitialize werd niet genoemd".
  2. Oplossen: "Canvas staat tekenen niet toe".
  3. Hoofd TADoConnection kan niet worden gebruikt!

Scenario voor klantorders

In het bekende scenario waarin een klant bestellingen plaatst die artikelen bevatten, moet u mogelijk alle bestellingen voor een bepaalde klant weergeven samen met het totale aantal artikelen per bestelling.

In een "normale" applicatie met één thread, moet u de query uitvoeren om de gegevens op te halen en vervolgens de recordset herhalen om de gegevens weer te geven.

Als u deze bewerking voor meerdere klanten wilt uitvoeren, moet u dat doen voer de procedure opeenvolgend uit voor elk van de geselecteerde klanten.

In een multithreaded scenario kunt u de databasequery voor elke geselecteerde klant uitvoeren in een afzonderlijke thread-en laat de code dus meerdere keren sneller uitvoeren.

Multithreading in dbGO (ADO)

Stel dat u bestellingen voor 3 geselecteerde klanten wilt weergeven in een Delphi-keuzelijstbesturing.

 type

   TCalcThread = klasse(TThread)

  
privaat

     procedure RefreshCount;

  
beschermde

     procedure voeren; override;

  
openbaar

     ConnStr: widestring;

     SQLString: widestring;

     ListBox: TListBox;

     Prioriteit: TThreadPriority;

     TicksLabel: TLabel;

 

     Teken: kardinaal;

   einde;

Dit is het interfacedeel van een aangepaste threadklasse die we gaan gebruiken om alle bestellingen voor een geselecteerde klant op te halen en uit te voeren.

Elke bestelling wordt weergegeven als een item in een keuzelijst (Keuzelijst veld). De ConnStr veld bevat de ADO-verbindingsreeks. De TicksLabel bevat een verwijzing naar een TLabel-besturingselement dat wordt gebruikt om uitvoeringstijden van threads weer te geven in een gesynchroniseerde procedure.

De RunThread procedure maakt en voert een instantie van de TCalcThread-threadklasse uit.

 functie TADOThreadedForm.RunThread (SQLString: widestring; LB: TListBox; Priority: TThreadPriority; lbl: TLabel): TCalcThread;

var

   CalcThread: TCalcThread;

 beginnen

   CalcThread: = TCalcThread.Create (true);

   CalcThread.FreeOnTerminate: = true;

   CalcThread.ConnStr: = ADOConnection1.ConnectionString;

   CalcThread.SQLString: = SQLString;

   CalcThread.ListBox: = LB;

   CalcThread.Priority: = Prioriteit;

   CalcThread.TicksLabel: = lbl;

   CalcThread.OnTerminate: = ThreadTerminated;

   CalcThread.Resume;

 

   Resultaat: = CalcThread;

 einde;