Intéressant

Synchronisation des threads et de l'interface graphique dans une application Delphi

Synchronisation des threads et de l'interface graphique dans une application Delphi


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.

Le multi-threading dans Delphi vous permet de créer des applications qui incluent plusieurs chemins d'exécution simultanés.

Une application Delphi normale est à thread unique, ce qui signifie que tous les objets VCL accèdent à leurs propriétés et exécutent leurs méthodes dans ce thread unique. Pour accélérer le traitement des données dans votre application, incluez un ou plusieurs threads secondaires.

Threads de processeur

UNE fil est un canal de communication entre une application et un processeur. Les programmes à un seul thread ont besoin que la communication circule dans les deux sens (vers et depuis le processeur) pendant son exécution; Les applications multithreads peuvent ouvrir plusieurs canaux différents, accélérant ainsi l'exécution.

Fils et interface graphique

Lorsque plusieurs threads sont en cours d'exécution dans l'application, la question se pose de savoir comment vous pouvez mettre à jour votre interface utilisateur graphique à la suite d'une exécution de thread. La réponse se trouve dans la classe TThread Synchroniser méthode.

Pour mettre à jour l'interface utilisateur ou le thread principal de votre application à partir d'un thread secondaire, vous devez appeler la méthode Synchronize. Cette technique est une méthode thread-safe qui évite les conflits multi-thread pouvant résulter de l'accès à des propriétés d'objet ou à des méthodes qui ne sont pas thread-safe ou de l'utilisation de ressources n'appartenant pas au thread principal de l'exécution.

Vous trouverez ci-dessous un exemple de démonstration utilisant plusieurs boutons avec des barres de progression, chaque barre de progression affichant "l'état" actuel de l'exécution du thread.

unité principale;
interface
les usages
Windows, Messages, SysUtils, Variants, Classes, Graphiques, Contrôles, Formulaires,
Dialogs, ComCtrls, StdCtrls, ExtCtrls;
type
// classe d'intercepteur
TButton = class (StdCtrls.TButton)
OwnedThread: TThread;
ProgressBar: TProgressBar;
fin;
TMyThread = class (TThread)
privé
FCounter: Integer;
FCountTo: Integer;
FProgressBar: TProgressBar;
FOwnerButton: TButton;
procédure DoProgress;
procedure SetCountTo (valeur const: Integer);
procedure SetProgressBar (const Valeur: TProgressBar);
procedure SetOwnerButton (const Valeur: TButton);
protégé
procedure Execute; passer outre;
Publique
constructeur Create (CreateSuspended: Boolean);
property CountTo: Entier en lecture FCountTo en écriture SetCountTo;
propriété ProgressBar: TProgressBar read FProgressBar write SetProgressBar;
property OwnerButton: TButton lire FOwnerButton écrire SetOwnerButton;
fin;
TMainForm = classe (TForm)
Button1: TButton;
ProgressBar1: TProgressBar;
Button2: TButton;
ProgressBar2: TProgressBar;
Button3: TButton;
ProgressBar3: TProgressBar;
Button4: TButton;
ProgressBar4: TProgressBar;
Button5: TButton;
ProgressBar5: TProgressBar;
procedure Button1Click (Sender: TObject);
fin;
var
MainForm: TMainForm;
la mise en oeuvre
{$ R * .dfm}
{TMyThread}
constructeur TMyThread.Create (CreateSuspended: Boolean);
commencer
hérité;
FCounter: = 0;
FCountTo: = MAXINT;
fin;
procédure TMyThread.DoProgress;
var
PctDone: étendu;
commencer
PctDone: = (FCounter / FCountTo);
FProgressBar.Position: = Round (FProgressBar.Step * PctDone);
FOwnerButton.Caption: = FormatFloat ('0,00%', PctDone * 100);
fin;
procédure TMyThread.Execute;
const
Intervalle = 1000000;
commencer
FreeOnTerminate: = True;
FProgressBar.Max: = FCountTo div Interval;
FProgressBar.Step: = FProgressBar.Max;
tandis que FCounter <FCountTo
commencer
si FCounter mod Interval = 0 alors Synchronize (DoProgress);
Inc (FCounter);
fin;
FOwnerButton.Caption: = 'Démarrer';
FOwnerButton.OwnedThread: = nil;
FProgressBar.Position: = FProgressBar.Max;
fin;
procédure TMyThread.SetCountTo (const Valeur: Integer);
commencer
FCountTo: = valeur;
fin;
procedure TMyThread.SetOwnerButton (valeur const: TButton);
commencer
FOwnerButton: = valeur;
fin;
procedure TMyThread.SetProgressBar (valeur const: TProgressBar);
commencer
FProgressBar: = valeur;
fin;
procedure TMainForm.Button1Click (Sender: TObject);
var
aButton: TButton;
aThread: TMyThread;
aProgressBar: TProgressBar;
commencer
aButton: = TButton (Sender);
si non assigné (aButton.OwnedThread) alors
commencer
aThread: = TMyThread.Create (True);
aButton.OwnedThread: = aThread;
aProgressBar: = TProgressBar (FindComponent (StringReplace (aButton.Name, 'Button', 'ProgressBar',):)));
aThread.ProgressBar: = aProgressBar;
aThread.OwnerButton: = aButton;
aThread.Resume;
aButton.Caption: = 'Pause';
fin
autre
commencer
si aButton.OwnedThread.Suspended alors
aButton.OwnedThread.Resume
autre
aButton.OwnedThread.Suspend;
aButton.Caption: = 'Exécuter';
fin;
fin;
fin.

Merci à Jens Borrisholt d’avoir soumis cet exemple de code.


Video, Sitemap-Video, Sitemap-Videos