Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 110. - práce ve volném čase

Jan Šindelář - 1.10.2003

Oč se tedy bude dnes jednat? Naše spuštěná aplikace není zrovna vždy dostatečně vytížena. Dalo by se říct, že většinu času čeká na nějaký vstup ze strany uživatele a nedělá nic. Dostává se do stavu idle, tedy mimo aktivitu. Naopak jsou zase chvíle, kdy aplikace "jede" na maximum a pak zase od ní nemůžeme očekávat nějakou jinou činnost. Právě v době, kdy aplikace nedělá "nic" můžeme tohoto času využít a uložit jí některé "méně náročné" a ne tak důležité úkoly. Co to může být konkrétně, to již nechám na vás. My si jen dnes ukážeme, jak detekovat stav, kdy se aplikace dostane do klidu, a jak jí říci, co má v tu dobu dělat.

Vše má na starosti událost OnIdle, která je vyvolána právě v okamžiku, kdy se aplikace dostane do klidu. Kdy to přesně nastane, to záleží již na systému. Tato událost ale nepatří k formuláři (TForm), ale přímo k nadřazenému objektu TApplication, ke kterému nemáme přístup přes Object Inspectora. Nejprve v události OnCreate hlavního formuláře přesměrujeme událost OnIdle na provádění našeho kódu. Ten poté specifikujeme v samostatné proceduře. Bude se jednat pouze o vizuální reprezentaci stavu nečinnosti, který bude v tomto případě znázorněn pomocí komponenty ProgressBar. V době nečinnosti aplikace se bude ProgressBar postupně zvětšovat od nuly do maxima a tak stále dokola. Umístěte tedy na formulář ProgressBar.

Pro simulaci nějaké činnosti aplikace si přidáme na formulář tlačítko a do události OnClick umístíme jednoduchý repeat cyklus, který bude po 10 sekund simulovat zatížení aplikace.

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    ProgressBar1: TProgressBar;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure MyIdleHandler(Sender: TObject; var done: Boolean);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MyIdleHandler(Sender: TObject; var done: Boolean);
begin
  if ProgressBar1.Position <100 then ProgressBar1.Position := ProgressBar1.Position + 1
                                else ProgressBar1.Position := 0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnIdle := MyIdleHandler;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  dt, dtn: TDateTime;
begin
  dt := Now;
  repeat
    dtn := Now;
  until dtn > (dt + 10 / 3600 / 24);
end;

end.

Pochopitelně je rozumné, umístit do Idle části pouze takový kód, který nebude příliš náročný a nebude aplikaci moc zatěžovat, protože pak by to jaksi nemělo moc smysl. Jinak se pochopitelně fantazii meze nekladou.