Multithread-Programmierung unter DELPHI (1)
Wir wissen, dass sowohl Win95 als auch WinNT „Multithread“-Betriebssysteme sind. In DELPHI 2.0 können wir diese Funktion voll ausnutzen und „Multithread“-Anwendungen schreiben.
Für diejenigen, die in der Vergangenheit Programme unter DOS oder 16-Bit-Windows geschrieben haben, ist „Multithreading“ immer noch unbekannt, aber genauso wie wir von Einzeltasking unter DOS zu Multitasking unter Windows 3.1 übergegangen sind, müssen wir jetzt den Übergang erneut vollziehen Auf dem Gebiet des „Multi-Threading“ entwickelt sich das Computerzeitalter schließlich ständig weiter. Glücklicherweise erfordert die Multithread-Programmierung unter DELPHI2.0 jedoch nicht das Erlernen der umfangreichen WIN32API-Funktionen. Wir können die Standard-Multithread-Klasse TThread unter DELPHI verwenden, um unsere Arbeit abzuschließen.
TThread ist eine abstrakte Klasse, das heißt, es besteht keine Notwendigkeit, auf TThread basierende Variablen zu deklarieren (und auf TThread basierende Variablen sind völlig nutzlos. Wir müssen TThread als Basisklasse verwenden und in generieren). die Form der Vererbung. Tatsächlich ist es sehr einfach, Multithread-Anwendungen basierend auf TThread zu schreiben.
Das Folgende ist eine grundlegende Multithread-Klasse, die durch Erben von TThread generiert wird.
QuerThrd. Pas
unitQuerThrd;
Schnittstelle
verwendet
Klassen, DBTables;
Typ
TQueryThreadΚclass(TThread)
Privat
fQuery:tQuery;
geschützt
procedureExecute;override;
öffentlich
KonstruktorCreate(Suspended: Boolean; Query: TQuery);
Ende;
Durchführung
Konstrukteur
TQueryThread. Create(Suspended: Boolean; Query: TQuery);
beginnen
inheritedCreate(Suspended);
fQuery: ΚQuery;
FreeOnTerminate:ΚTrue;
Ende;
procedureTQueryThread. Ausführen;
beginnen
fQuery. Offen;
Ende;
Ende.
Im obigen einfachen Beispiel haben wir eine TQuery-Thread-Unterklasse von TThread erstellt, um Datenbankabfragen im Hintergrund auszuführen. In der Create-Funktion dieser Klasse werden zwei Parameter Suspended und Query übergeben, wobei Suspended zur Steuerung der Ausführung des Threads verwendet wird. Wenn Suspend true ist, wird der Thread der TQueryThread-Klasse sofort nach seiner Einrichtung bis zum Resume angehalten Die Methode wird weiterhin ausgeführt. Der Query-Parameter wird verwendet, um ein vorhandenes Query-Steuerelement (das eigentliche Query-Steuerelement im Formular) zu akzeptieren, damit es in einer Multithread-Situation ausgeführt wird. Execute ist der wichtigste Prozess. Es ist der Ausführungsteil der Klasse TQueryThread. Alle Anweisungen, die in dieser Multithread-Klasse ausgeführt werden müssen, müssen in diesem Prozess geschrieben werden.
Tatsächlich müssen Sie beim Erstellen Ihrer eigenen Multithread-Klasse nicht alle diese Codes eingeben. Wählen Sie die neue Option im DELPHI-Menü „Datei“ und dann das „TThreadObject“-Projekt aus, und DELPHI erstellt das grundlegende Programmmodul für Sie. Dann können wir bei Bedarf entsprechende Änderungen vornehmen.
Prozessausführung:
Angenommen, wir haben ein Formular FORM1 erstellt, das das Abfragesteuerelement Query1 enthält, das wir verwenden werden. Dann fügen wir die oben beschriebene QuerThrd-Einheit zum USES-Teil der Einheit hinzu.
procedureTForm1. Button1Click(Sender: TObject);
beginnen
{Erstellen Sie einen laufenden Prozess}
TQueryThread. Create(False,Query1);
Ende;
Wenn dieser Prozess ausgeführt wird, führt das Abfragesteuerelement Query1 im Formular die Abfrage automatisch in einer Multithread-Umgebung aus. Beachten Sie, dass es in der TQueryThread-Klasse nur Create, aber nicht Free gibt. Nachdem wir eine Klasse dynamisch erstellt und dann vergessen haben, sie zu löschen, ist dies einer der Fehler, die wir häufig machen, da wir FreeOnTerminate (Löschen nach Ausführung) als true angegeben haben hier, wenn die Anweisung in Execute ausgeführt wird Nach Abschluss wird die von der TQueryThread-Klasse belegte Speichersteuerung automatisch freigegeben.
Es gibt jedoch noch ein weiteres Problem, das unsere Aufmerksamkeit verdient. Da mehrere Threads gleichzeitig ausgeführt werden können, müssen wir auch das Synchronisationsproblem lösen. Wenn zwischen mehreren Multithread-Programmen keine Korrelation besteht. irgendein Konflikt. Tatsächlich können jedoch mehrere Multithread-Datenbankanwendungen gleichzeitig ausgeführt werden. Da dieselben Datenbankressourcen gemeinsam genutzt werden müssen, müssen wir auch ein Tsession-Steuerelement zu Query1 hinzufügen.
Obwohl wir die Sitzungssteuerung möglicherweise nicht persönlich verwendet haben, erstellt DELPHI bei allen Datenbankzugriffen automatisch eine temporäre Sitzungssteuerung und löscht sie nach der Verwendung dynamisch. Bei der normalen Datenbankprogrammierung müssen wir dies nicht selbst tun. Bei der Multithread-Ausführung der Datenbank müssen wir jedoch für jeden Datenbankzugriff unsere eigene Sitzungssteuerung anpassen, um keinen Konflikt miteinander zu verursachen. Dieser Schritt ist sehr einfach. Wir müssen nur ein Sitzungssteuerelement zum Formular hinzufügen, dann einen beliebigen Namen in seine Eigenschaft „Sitzungsname“ schreiben und dann denselben Namen in „Sitzungsname“ von Abfrage1 schreiben. Auf diese Weise ist unser Datenbankprogramm sicher.
Eine andere Art von Synchronisationsproblem, das gelöst werden muss, sind Programme, die mit VCL-Ressourcen arbeiten. Es gibt viele solcher Programme, aber glücklicherweise ist die Lösung auch sehr einfach.
Wir können uns ein Programm wie dieses ansehen:
unitBncThrd;
Schnittstelle
verwendet
WinProcs, Klassen, Grafiken, ExtCtrls;
Typ
TBounceThreadΚclass(TThread)
Privat
FShape: TShape;
FXSpeed: Ganzzahl;
FYSpeed: Ganzzahl;
procedureMoveShape;
geschützt
procedureExecute;override;
öffentlich
KonstruktorCreate(Suspended: Boolean; Shape: TShape; XSpeed, YSpeed: Integer);
propertyShape: TShapereadFShape;
Ende;
Durchführung
VerfahrenTBouad. MoveShape;
var
MaxHeight, MaxWidth: Integer;
beginnen
mitFShapedo
beginnen
Links: ΚLinks+FXSpeed;
Oben: ΚTop+FYSpeed;
if(LinksΙ0)oder
(Links+BreiteΛÜbergeordnetes.Breite)dann
FXSpeed: ΚFXSpeed*-1;
if(TopΙ0)or
(Oben+HöheΛParent.Höhe)dann
FYSpeed: ΚFYSpeed*-1;
Blog des Autors: http://blog.csdn.net/zou5655/