Programmation multi-thread sous DELPHI (1)
Nous savons que win95 ou winNT sont tous deux des systèmes d'exploitation "multi-thread". Dans DELPHI 2.0, nous pouvons exploiter pleinement cette fonctionnalité et écrire des applications "multi-thread".
Pour ceux qui ont écrit des programmes sous DOS ou Windows 16 bits dans le passé, le "multi-threading" n'est pas encore familier, mais tout comme nous sommes passés d'une tâche unique sous DOS au multitâche sous Windows 3.1, nous devons maintenant refaire la transition. Dans le domaine du "multi-threading", l'ère informatique est en effet en constante évolution. Cependant, heureusement, la programmation multithread sous DELPHI2.0 ne nous oblige pas à apprendre les énormes fonctions WIN32API. Nous pouvons utiliser la classe multithread standard TThread sous DELPHI pour terminer notre travail.
TThread est une classe abstraite, c'est-à-dire qu'il n'est pas nécessaire de déclarer des variables basées sur TThread (et les variables déclarées basées sur TThread sont complètement inutiles. Ce que nous devons faire est d'utiliser TThread comme classe de base et de le générer). la forme d’héritage. En fait, il est très simple d’écrire des applications multithread basées sur TThread.
Ce qui suit est une classe multithread de base générée en héritant de TThread.
QuerThrd. Pas
unitQuerThrd ;
interface
utilise
Classes, DBTables ;
taper
TQueryThreadΚclass(TThread)
Privé
fRequête :tRequête ;
protégé
procédureExécuter;remplacer;
publique
constructorCreate (Suspendu : Booléen ; Requête : TQuery);
fin;
mise en œuvre
constructeur
TQueryThread. Créer (Suspendu : Booléen ; Requête : TQuery) ;
commencer
héritéCreate (Suspendu);
fRequête : ΚRequête ;
FreeOnTerminate :ΚTrue ;
fin;
procédureTQueryThread. Exécuter;
commencer
fRequête. Ouvrir;
fin;
fin.
Dans l'exemple simple ci-dessus, nous avons construit une sous-classe TQuery-Thread de TThread pour exécuter des requêtes de base de données en arrière-plan. Dans la fonction Create de cette classe, deux paramètres Suspended et Query sont passés, où Suspended est utilisé pour contrôler le fonctionnement du thread. Si Suspend est vrai, le thread de la classe TQueryThread sera suspendu immédiatement après son établissement jusqu'à la reprise. est exécutée. Le thread continuera à s'exécuter. Le paramètre Query est utilisé pour accepter un contrôle Query existant (le véritable contrôle Query dans le formulaire) pour le faire exécuter dans une situation multithread. L'exécution est le processus le plus important. C'est la partie exécution de la classe TQueryThread. Toutes les instructions qui doivent être exécutées dans cette classe multithread doivent être écrites dans ce processus.
En fait, lors de la construction de votre propre classe multithread, vous n'avez pas besoin de saisir tous ces codes. Sélectionnez la nouvelle option dans le menu Fichier de DELPHI, puis sélectionnez le projet "TThreadObject", et DELPHI construira le module de programme de base pour vous. Nous pouvons ensuite apporter les modifications correspondantes si nécessaire.
Exécution du processus :
Supposons que nous ayons créé un formulaire FORM1, qui contient le contrôle de requête Query1 que nous allons utiliser. Ensuite, nous ajoutons l'unité QuerThrd écrite ci-dessus à la partie USES de l'unité.
procédureTForm1. Button1Click (Expéditeur : TObject );
commencer
{Créer un processus en cours d'exécution}
TQueryThread. Créer(Faux,Requête1);
fin;
Si ce processus est exécuté, le contrôle de requête Query1 dans le formulaire exécutera automatiquement la requête dans un environnement multithread. Notez qu'il n'y a que Create mais pas Free dans la classe TQueryThread. Après avoir créé dynamiquement une classe puis oublié de la supprimer, c'est l'une des erreurs que nous commettons souvent. Cependant, puisque nous avons spécifié FreeOnTerminate (supprimer après exécution) comme vrai. ici, lorsque l'instruction dans Execute est exécutée. Une fois terminé, le contrôle mémoire occupé par la classe TQueryThread sera automatiquement libéré.
Cependant, il existe un autre problème qui mérite notre attention : étant donné que plusieurs threads peuvent s'exécuter en même temps, nous devons également résoudre le problème de synchronisation. S'il n'y a pas de corrélation entre plusieurs programmes multithreads, alors il n'y aura pas de corrélation entre eux. tout conflit. Mais en fait, plusieurs applications de base de données multithread peuvent s'exécuter en même temps. Puisque les mêmes ressources de base de données doivent être partagées, nous devons également ajouter un contrôle Tsession à Query1.
En fait, même si nous n'avons peut-être pas utilisé personnellement le contrôle de session, DELPHI créera automatiquement un contrôle de session temporaire lors de tous les accès à la base de données et le supprimera dynamiquement après utilisation. Dans la programmation normale d'une base de données, nous n'avons pas besoin de le faire nous-mêmes, mais dans le cas d'une exécution multithread de la base de données, afin de ne pas entrer en conflit les uns avec les autres, nous devons personnaliser notre propre contrôle de session pour chaque accès à la base de données. Cette étape est très simple. Il suffit d'ajouter un contrôle Session au formulaire, puis d'écrire un nom arbitraire dans sa propriété "Sessionname", puis d'écrire le même nom dans le "Sessionname" de Query1. De cette façon, notre programme de base de données est sécurisé.
Un autre type de problème de synchronisation qui doit être résolu concerne les programmes qui fonctionnent sur des ressources VCL. Il existe de nombreux programmes de ce type, mais heureusement, la solution est également très simple.
Nous pouvons regarder un programme comme celui-ci :
unitéBncThrd;
interface
utilise
WinProcs, Classes, Graphiques, ExtCtrls ;
taper
TBounceThreadΚclass(TThread)
privé
Forme : Forme T ;
FXSpeed : entier ;
FYSpeed : entier ;
procédureMoveShape ;
protégé
procédureExécuter;remplacer;
publique
constructorCreate (Suspendu : Booléen ; Forme : TShape ; XSpeed, YSpeed : Integer);
propertyShape : TShapereadFShape ;
fin;
mise en œuvre
procédureTBouad. Déplacer la forme ;
var
MaxHeight, MaxWidth : entier ;
commencer
avecFShapedo
commencer
Gauche : ΚGauche+FXSpeed ;
Haut : ΚTop+FYSpeed ;
si(GaucheΙ0)ou
(Gauche + Largeur Λ Parent .Largeur) puis
FXSpeed : ΚFXSpeed*-1 ;
si (TopΙ0) ou
(Haut+HauteurΛParent.Hauteur)puis
FYSpeed : ΚFYSpeed*-1 ;
Blog de l'auteur : http://blog.csdn.net/zou5655/