Tipy a triky v Delphi, díl 97.

Nejen samotný výkon počítače, ale rovněž úspora energie dnes hraje velkou roli a to nejen u notebooků. Naučíme se detekovat, zda jsou na počítači povoleny rozličné úsporné režimy.
Dnešní téma je jasné, takže se rovnou pustíme do práce. Nejprve si drobně ujasníme pojmy. Nechci zabřednout do nějakého slovíčkaření a proto prosím čtenáře věci znalé, aby omluvili zjednodušení. Pro jednoduchost se tedy dá říci, že běžný úsporný režim (suspend) uvede počítač do jakéhosi polospánku, ve kterém se vypne monitor, uspí se disky, celkově se sníží spotřeba a jelikož i procesor pracuje na minimum, chytřejší základní desky obvykle i sníží otáčky větráků. Probuzení pak trvá obvykle jen několik sekund. Režim spánku jde ještě o krok dál. Uloží stav počítače na disk (včetně obsahu paměti, takže se na disku vytvoří tak velký soubor, jak velkou máte RAM) a vypne ho kompletně. Probuzení (vlastně opětovné zapnutí) již pak trvá o něco déle, ale "uložená pozice" se obvykle načte znatelně rychleji než normální restart operačního systému a navíc je počítač ve stejném stavu, jako byl před usnutím, takže již běží všechny předtím spuštěné aplikace.

Tolik tedy pro představu, o čem se vlastně dnes budeme bavit. Kromě toho, že samotný počítač musí zvládat jednotlivé režimy hardwarově, může si je navíc uživatel zapnout či vypnout přímo ve Windows. A právě to, jestli jsou tyto dva úsporné režimy povoleny a lze je tím pádem aktivovat, se teď naučíme detekovat.

Zdrojový kód se skládá ze dvou víceméně totožných funkcí, přičemž první slouží k otestování možnosti použití režimu spánku (hibernace), druhá má na starost "klasický" úsporný režim.

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function HibernateAllowed: Boolean;
type
  TIsPwrHibernateAllowed = function: Boolean; stdcall;
var
  hPowrprof: HMODULE;
  IsPwrHibernateAllowed: TIsPwrHibernateAllowed;
begin
  Result := False;
  try
  hPowrprof := LoadLibrary(`powrprof.dll`);
  if hPowrprof <> 0 then
  begin
    try
      @IsPwrHibernateAllowed := GetProcAddress(hPowrprof, `IsPwrHibernateAllowed`);
      if @IsPwrHibernateAllowed <> nil then Result := IsPwrHibernateAllowed;
    finally
      FreeLibrary(hPowrprof);
    end;
  end;
  except
  end;
end;

function SuspendAllowed: Boolean;
type
  TIsPwrSuspendAllowed = function: Boolean; stdcall;
var
  hPowrprof: HMODULE;
  IsPwrSuspendAllowed: TIsPwrSuspendAllowed;
begin
  Result := False;
  try
  hPowrprof := LoadLibrary(`powrprof.dll`);
  if hPowrprof <> 0 then
  begin
    try
      @IsPwrSuspendAllowed := GetProcAddress(hPowrprof, `IsPwrSuspendAllowed`);
      if @IsPwrSuspendAllowed <> nil then Result := IsPwrSuspendAllowed;
    finally
      FreeLibrary(hPowrprof);
    end;
  end;
  except
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if HibernateAllowed then ShowMessage(`Rezim spanku povolen.`)
                      else ShowMessage(`Rezim spanku NENI povolen!`);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if SuspendAllowed then ShowMessage(`Usporny rezim povolen.`)
                    else ShowMessage(`Usporny rezim NENI povolen!`);
end;

end.

Na závěr pro doplnění snad jen poznámka, že u starších systémů (95 a NT4) ani nemá cenu hibernaci testovat, protože tyto systémy ji nepodporují. Plně funkční je až od verze Windows ME.

Témata článku: Software, Windows, Programování, Díl, Trik

Určitě si přečtěte


Aktuální číslo časopisu Computer

26 procesorů v důkladném testu

Zhodnotili jsme 18 bezdrátových reproduktorů

Jak fungují cash back služby?

Pohlídejte své děti na internetu