Delphi par l'exemple |
Part 1 Part2 Partie 3 : utilisation d'un thread
![]() |
Pour cet exercice nous avons besoin des composants suivants :
-
un éditeur de texte
- un mémo
- deux boutons pour lancer et arrêter la lecture
Code source de l'unité :
{ documentation : http://www.delphifr.com/codes/THREADS-EXEMPLE-AVEC-CHRONOMETRE_11948.aspx } unit u_Thread; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type { le Thread chargé de la lecture du gps } TThreadTrame = class(TThread) private { Déclarations privées } protected constructor Create(CreateSuspended: Boolean); procedure Execute; override; procedure LireTrame; end; { programme principal } TForm1 = class(TForm) Button1: TButton; Button2: TButton; RMCEdit: TEdit; // affichage de la trame RMC TrameMemo: TMemo; // affichage de toutes les trames reçues Label2: TLabel; procedure Button1Click(Sender: TObject); // lancer la lecture du GPS procedure Button2Click(Sender: TObject); // arrêter la lecture du GPS procedure AfficherTrame(p_Ligne: String); private { Déclarations privées } public { Déclarations publiques } ThreadTrame: TThreadTrame; { g_OK = vrai -> lecture g_OK = faux -> pas de lecture } g_OK: boolean; // doit être obligatoirement dans TForm1 end; var Form1: TForm1; g_Ligne: String; g_Serial: TFILEStream; g_Buff: Byte; implementation {$R *.DFM} {----------------------} { procédures de TForm1 } {----------------------} procedure TForm1.Button1Click(Sender: TObject); begin g_OK := true; g_Serial := TFileStream.Create('COM4', fmOpenRead); ThreadTrame := TThreadTrame.Create(true); while g_OK do begin Application.ProcessMessages; AfficherTrame(g_Ligne) end end; procedure TForm1.Button2Click(Sender: TObject); begin g_OK := false; ThreadTrame.Terminate; g_Serial.Free; end; procedure TForm1.AfficherTrame(p_Ligne: String); begin ThreadTrame.Suspend; { affichage de la trame RMC } if Copy(p_Ligne, 4, 3) = 'RMC' then Form1.RMCEdit.Text := g_Ligne; { affichage des trames dans le mémo } { le caractères RC de p_Ligne est supprimé pour ne pas cumuler } { les retours de ligne } Form1.TrameMemo.Lines.Add(Copy(p_Ligne, 1, Length(p_Ligne)-1)); ThreadTrame.Resume end; {----------------------------} { procédures de TThreadTrame } {----------------------------} constructor TThreadTrame.Create(CreateSuspended: Boolean); begin Inherited Create(CreateSuspended); FreeOnTerminate := true; Priority := tpNormal; if CreateSuspended then Resume end; procedure TThreadTrame.Execute; begin while Form1.g_OK do Synchronize(LireTrame) end; procedure TThreadTrame.LireTrame; begin { lecture de la trame } try g_Ligne := ''; try repeat g_Serial.Read(g_Buff, 1) until Chr(g_Buff) = '$'; g_Ligne := g_Ligne + Chr(g_Buff); while g_Buff <> 10 do begin g_Serial.Read(g_Buff, 1); g_Ligne := g_Ligne + Chr(g_Buff) end except MessageDlg('Erreur de communication !', mtError, [mbOK], 0); end finally end; end; { TThreadTrame.LireTrame } end. |
Nous obtenons le même résultat que précédemment, mais en utilisant cette fois un thread. Je recommande au lecteur de lire attentivement l'aide de Delphi sur les threads. Nous n'avons pas utilisé d'unité pour le thread, mais cela est possible comme dans les exemples donnés. Les
procédures de Form1 se réduisent aux procédures
ButtonClick. Remarque
: (à suivre) |
Fichiers source thread.zip