Requêtes de base de données Delphi multithread

De par sa conception, une application Delphi s'exécute dans un seul thread. Pour accélérer certaines parties de l'application, vous pouvez décider d'ajouter plusieurs chemins d'exécution simultanés dans votre application Delphi.

Multithreading dans les applications de base de données

Dans la plupart des scénarios, les applications de base de données que vous créez avec Delphi sont à thread unique - une requête que vous exécutez sur la base de données doit terminer (traitement des résultats de la requête) avant de pouvoir récupérer un autre ensemble de données.

Pour accélérer le traitement des données, par exemple, la récupération de données de la base de données pour créer des rapports, vous pouvez ajouter un thread supplémentaire pour récupérer et opérer sur le résultat (jeu d'enregistrements).

Continuez votre lecture pour en savoir plus sur les 3 interruptions dans les requêtes de base de données ADO multithread:

  1. Résoudre: "CoInitialize n'a pas été appelé".
  2. Résoudre: "La toile ne permet pas de dessiner".
  3. TADoConnection principal ne peut pas être utilisé!

Scénario de commande client

Dans le scénario bien connu où un client passe des commandes contenant des articles, vous devrez peut-être afficher toutes les commandes pour un client particulier avec le nombre total d'articles pour chaque commande..

Dans une application monothread "normale", vous devez exécuter la requête pour récupérer les données, puis parcourir le jeu d'enregistrements pour afficher les données.

Si vous souhaitez exécuter cette opération pour plusieurs clients, vous devez exécuter séquentiellement la procédure pour chacun des clients sélectionnés.

Dans un scénario multithread, vous pouvez exécuter la requête de base de données pour chaque client sélectionné dans un thread séparé-et ainsi faire exécuter le code plusieurs fois plus vite.

Multithreading dans dbGO (ADO)

Supposons que vous souhaitiez afficher les commandes de 3 clients sélectionnés dans un contrôle de zone de liste Delphi.

 type

   TCalcThread = classe(TThread)

  
privé

     procédure RefreshCount;

  
protégé

     procédure Exécuter; passer outre;

  
Publique

     ConnStr: widestring;

     SQLString: widestring;

     ListBox: TListBox;

     Priorité: TThreadPriority;

     TicksLabel: TLabel;

 

     Tiques: cardinal;

   fin;

Il s'agit de la partie interface d'une classe de threads personnalisée que nous allons utiliser pour récupérer et opérer toutes les commandes d'un client sélectionné..

Chaque commande s'affiche en tant qu'article dans un contrôle de zone de liste (ListBox champ). le ConnStr Le champ contient la chaîne de connexion ADO. le TicksLabel contient une référence à un contrôle TLabel qui sera utilisé pour afficher les temps d'exécution des threads dans une procédure synchronisée.

le RunThread crée et exécute une instance de la classe de threads TCalcThread.

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

var

   CalcThread: TCalcThread;

 commencer

   CalcThread: = TCalcThread.Create (true);

   CalcThread.FreeOnTerminate: = true;

   CalcThread.ConnStr: = ADOConnection1.ConnectionString;

   CalcThread.SQLString: = SQLString;

   CalcThread.ListBox: = LB;

   CalcThread.Priority: = Priorité;

   CalcThread.TicksLabel: = lbl;

   CalcThread.OnTerminate: = ThreadTerminated;

   CalcThread.Resume;

 

   Résultat: = CalcThread;

 fin;