Interogări de baze de date Delphi multithreaded

Prin proiectare, o aplicație Delphi rulează într-un singur fir. Pentru a accelera unele părți ale aplicației, poate doriți să decideți să adăugați mai multe căi de execuție simultane în aplicația dvs. Delphi.

Multitratare în aplicații de baze de date

În majoritatea scenariilor, aplicațiile de bază de date pe care le creați cu Delphi sunt single-threaded - o interogare pe care o executați împotriva bazei de date trebuie să finalizeze (procesarea rezultatelor interogării) înainte de a putea prelua un alt set de date.

Pentru a accelera procesarea datelor, de exemplu, preluarea datelor din baza de date pentru a crea rapoarte, puteți adăuga un fir suplimentar pentru a obține și opera pe rezultat (set de înregistrări).

Continuați să citiți pentru a afla despre cele 3 capcane din interogările bazei de date ADO multitratate:

  1. Rezolvați: "CoInitialize nu a fost apelat".
  2. Rezolvați: "Panza nu permite desen".
  3. TADoConnection principal nu poate fi utilizat!

Scenariul comenzilor clienților

În binecunoscutul scenariu în care un client plasează comenzi care conțin articole, poate fi necesar să afișați toate comenzile pentru un anumit client de-a lungul numărului total de articole pentru fiecare comandă..

Într-o aplicație "normală" cu o singură filetare, va trebui să rulați interogarea pentru a obține datele, apoi se vor itera peste setul de înregistrări pentru a afișa datele.

Dacă doriți să executați această operațiune pentru mai mulți clienți, trebuie să o faceți executați secvențial procedura pentru fiecare dintre clienții selectați.

Într-o scenariu multithreaded puteți rula interogarea bazei de date pentru fiecare client selectat într-un thread separat-și, astfel, să execute codul de câteva ori mai rapid.

Multitratare în dbGO (ADO)

Să spunem că doriți să afișați comenzi pentru 3 clienți selectați într-un control al casetei listă Delphi.

 tip

   TCalcThread = clasă(TThread)

  
privat

     procedură RefreshCount;

  
protejat

     procedură A executa; trece peste;

  
public

     ConnStr: largestring;

     SQLString: largestring;

     ListBox: TListBox;

     Prioritate: TThreadPriority;

     TicksLabel: TLabel;

 

     Căpușe: cardinal;

   Sfârșit;

Aceasta este partea de interfață a unei clase de fire personalizate pe care o vom folosi pentru a obține și opera pe toate comenzile pentru un client selectat.

Fiecare comandă este afișată ca un articol într-un control al casetei de listă (ListBox camp). ConnStr câmpul conține șirul de conexiune ADO. TicksLabel deține o referință la un control TLabel care va fi utilizat pentru a afișa timpi de execuție a firului într-o procedură sincronizată.

RunThread procedura creează și rulează o instanță a clasei de thread TCalcThread.

 funcţie TADOThreadedForm.RunThread (SQLString: widestring; LB: TListBox; Prioritate: TThreadPriority; lbl: TLabel): TCalcThread;

var

   CalcThread: TCalcThread;

 începe

   CalcThread: = TCalcThread.Create (adevărat);

   CalcThread.FreeOnTerminate: = true;

   CalcThread.ConnStr: = ADOConnection1.ConnectionString;

   CalcThread.SQLString: = SQLString;

   CalcThread.ListBox: = LB;

   CalcThread.Priority: = Prioritate;

   CalcThread.TicksLabel: = lbl;

   CalcThread.OnTerminate: = ThreadTerminated;

   CalcThread.Resume;

 

   Rezultat: = CalcThread;

 Sfârșit;