Multithread-Delphi-Datenbankabfragen

Eine Delphi-Anwendung wird standardmäßig in einem Thread ausgeführt. Um einige Teile der Anwendung zu beschleunigen, möchten Sie möglicherweise mehrere gleichzeitige Ausführungspfade in Ihrer Delphi-Anwendung hinzufügen.

Multithreading in Datenbankanwendungen

In den meisten Szenarien sind Datenbankanwendungen, die Sie mit Delphi erstellen, Single-Threaded-Abfragen, die Sie für die Datenbank ausführen müssen, um fertig zu sein (Verarbeitung der Abfrageergebnisse), bevor Sie einen anderen Datensatz abrufen können.

Um die Datenverarbeitung zu beschleunigen, beispielsweise das Abrufen von Daten aus der Datenbank zum Erstellen von Berichten, können Sie einen zusätzlichen Thread hinzufügen, um das Ergebnis abzurufen und zu verarbeiten (Recordset)..

Lesen Sie weiter, um mehr über die drei Traps in ADO-Datenbankabfragen mit mehreren Threads zu erfahren:

  1. Löse:CoInitialize wurde nicht aufgerufen".
  2. Löse:Canvas erlaubt kein Zeichnen".
  3. Haupt-TADoConnection kann nicht verwendet werden!

Kundenauftragsszenario

In dem bekannten Szenario, in dem ein Kunde Bestellungen mit Artikeln aufgibt, müssen Sie möglicherweise alle Bestellungen für einen bestimmten Kunden zusammen mit der Gesamtzahl der Artikel pro Bestellung anzeigen.

In einer "normalen" Single-Thread-Anwendung müssten Sie die Abfrage ausführen, um die Daten abzurufen, und dann über das Recordset iterieren, um die Daten anzuzeigen.

Wenn Sie diesen Vorgang für mehr als einen Kunden ausführen möchten, müssen Sie dies tun Führen Sie die Prozedur nacheinander für jeden ausgewählten Kunden aus.

In einem Multithread-Szenario Sie können die Datenbankabfrage für jeden ausgewählten Kunden in einem separaten Thread ausführen-und damit den Code um ein Vielfaches schneller ausführen lassen.

Multithreading in dbGO (ADO)

Angenommen, Sie möchten Aufträge für 3 ausgewählte Kunden in einem Delphi-Listenfeld anzeigen.

 Art

   TCalcThread = Klasse(TThread)

  
Privat

     Verfahren RefreshCount;

  
geschützt

     Verfahren Ausführen; überschreiben;

  
Öffentlichkeit

     ConnStr: Widestring;

     SQLString: Widestring;

     ListBox: TListBox;

     Priorität: TThreadPriority;

     TicksLabel: TLabel;

 

     Zecken: Kardinal;

   Ende;

Dies ist der Interface-Teil einer benutzerdefinierten Thread-Klasse, mit der wir alle Bestellungen für einen ausgewählten Kunden abrufen und bearbeiten.

Jede Bestellung wird als Artikel in einem Listenfeld angezeigt (ListBox Feld). Das ConnStr Feld enthält die ADO-Verbindungszeichenfolge. Das TicksLabel Enthält einen Verweis auf ein TLabel-Steuerelement, mit dem die Ausführungszeiten von Threads in einer synchronisierten Prozedur angezeigt werden.

Das RunThread procedure erstellt und führt eine Instanz der Thread-Klasse TCalcThread aus.

 Funktion TADOThreadedForm.RunThread (SQLString: widestring; LB: TListBox; Priorität: TThreadPriority; lbl: TLabel): TCalcThread;

var

   CalcThread: TCalcThread;

 Start

   CalcThread: = TCalcThread.Create (true);

   CalcThread.FreeOnTerminate: = true;

   CalcThread.ConnStr: = ADOConnection1.ConnectionString;

   CalcThread.SQLString: = SQLString;

   CalcThread.ListBox: = LB;

   CalcThread.Priority: = Priorität;

   CalcThread.TicksLabel: = lbl;

   CalcThread.OnTerminate: = ThreadTerminated;

   CalcThread.Resume;

 

   Ergebnis: = CalcThread;

 Ende;