Utiliser les temps morts d'une application (d1..d6)

Soyez le premier à donner votre avis sur cette source.

Vue 4 165 fois - Téléchargée 324 fois

Description

Comment utiliser le temps où votre application est inactive pour effectuer une ou plusieurs tâches dans la mesure où la fréquence n'est pas un critère de choix dans la méthode à appliquer, et où l'utilisation des threads est un peu lourde à mettre en oeuvre dans un projet simple.

Source / Exemple :


unit UIdle;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    procedure FormActivate(Sender: TObject);
  private
    { Procédure déclenchée lors des temps morts de l'application}
    procedure AppIdle(Sender: TObject; var Done: Boolean);
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean);
begin
  //Afficher l'heure dans le TStatusBar
  StatusBar1.Panels[1].Text := TimeToStr(now);
  //Recommencer au prochain temps mort
  Done :=False;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  //Affectation d'une procédure à l'évènement OnIdle
  //de l'objet Application
  Application.OnIdle := AppIdle;
end;

end.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1237
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
14
«Application.OnIdle:=AppIdle» sur un évènement OnActivate est horrible !! OnCreate please !
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
27
Merci de ces précisions, Nono40.
Cet exempe se voulait purement démonstratif et je n'ai pas voulu le surcharger de façon à ne pas créer de confusions.
En utilisant la technique de Nono40, on peut facilement interrompre les traitements en positionnant à False une variable booléenne qui serait globale au niveau de l'unité.
var
Stop : boolean;

procedure TForm1.Checkbox1click(Sender: TObject);
begin
Stop := CheckBox1.Checked;
end;

procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean);
begin
Done := Stop;
if not done then
//traitement
end;
Messages postés
962
Date d'inscription
mercredi 3 avril 2002
Statut
Membre
Dernière intervention
12 septembre 2006
1
Ah si, j'oubliais : si dans le OnIdle ( quel que soit la méthode ) vous affichez un message, alors le OnIdle est appelé de nouveau au début car l'appli est de nouveau inactive. Si vous ne prenez pas garde, alors l'application va planter très vite. Vous devez vérifier vous-même la non réentrance de l'évènement :

Var IdleEnCours:Boolean;
procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean);
begin
If IdleEnCours then Exit;
IdleEnCours:=True;
Try
// Ici votre prog...
Finally
IdleEnCours:=False;
End;
Done :=False;
end;

Nono.
Messages postés
962
Date d'inscription
mercredi 3 avril 2002
Statut
Membre
Dernière intervention
12 septembre 2006
1
Pour les possesseurs de Delphi 5 ou 6, vous pouvez aussi utilisez le composant TApplicationEvents avec son évènement OnIdle. Pour les autres : suivez la bonne méthode de DelphiProg... elle fonctionne depuis Delphi 1.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.