Delphi - A Feladatütemező programozása

ITaskScheduler 4. rész

forráskód letöltése
A cikksorozatban már a TaskScheduler (Feladatütemező) programozásának legnagyobb részét áttekintettük, lekérdeztük a feladatok adatait, újat is hoztunk létre, de egy nagyon fontos rész még kimaradt, mégpedig a feladatok ütemezése, vagyis a feladat futtatásának időzítése. A feladatok időzítése nagyon rugalmasan történhet, sokféle beállítási lehetőség közül választhatunk, ezeket akár kombinálhatjuk is. A negyedik, és egyben fejező részben erről lesz szó.
Az időzítések megadásához egy újabb interfészt kell használnunk, ez lesz az ITaskTrigger. Egy feladathoz több időzítés is tartozhat, ezeket pedig triggereknek nevezzük..
CreateTrigger
Osztály: IScheduledWorkItem
function CreateTrigger(
out piNewTrigger: WORD;
out ppTrigger: ITaskTrigger
): HRESULT;
Egy új triggert hozhatunk létre ezzel a függvénnyel.
Paraméterek
out piNewTrigger: WORD
Az új Trigger sorszámát kapjuk meg ebben a paraméterben.
out ppTrigger: ITaskTrigger
Ebben a paraméterben kapjuk meg az interfész objektumát.
DeleteTrigger
Osztály: IScheduledWorkItem
function DeleteTrigger(
iTrigger: WORD
): HRESULT;
Törli a megadott sorszámú triggert.
Paraméterek
iTrigger: WORD
A törlendő trigger sorszáma.
GetTriggerCount
Osztály: IScheduledWorkItem
function GetTriggerCount(
out pwCount: WORD
): HRESULT;
A feladat triggereinek száma.
Paraméterek
out pwCount: WORD
Ebben a paraméterben kapjuk meg a triggerek számát.
GetTrigger
Osztály: IScheduledWorkItem
function GetTrigger(
iTrigger: WORD;
out ppTrigger: ITaskTrigger
): HRESULT;
Lekérdezi a megadott sorszámú trigger ITaskTrigger interfészének objektumát.
Paraméterek
iTrigger: WORD
A trigger sorszáma. Az első trigger sorszáma 0, a másodiké 1, stb.
out ppTrigger: ITaskTrigger
Ebben a paraméterben kapjuk meg az objektumot.
GetTriggerString
Osztály: IScheduledWorkItem
function GetTriggerString(
iTrigger: WORD;
out ppwszTrigger: PWideString
): HRESULT;
Lekérdezi a megadott sorszámú trigger adatait szöveges formában. Ez csak arra jó, hogy a felhasználóval egyszerűen közöljük a feladat indításainak időpontjait.
Paraméterek
iTrigger: WORD
A trigger sorszáma.
out ppwszTrigger: PWideString
Ebben a paraméterben kapjuk meg a trigger adatait szöveges formában.
SetTrigger
Osztály: ITaskTrigger
function SetTrigger(
const pTrigger: TTaskTrigger
): HRESULT;
Az időzítés tulajdonságait egy TTaskTrigger típusú struktúrában adhatjuk meg. Ezt a struktúrát a SetTrigger függvénnyel adhatjuk át a triggernek. A TTaskTrigger struktúra a következőképpen néz ki:
  TTaskTrigger = record
    cbTriggerSize   : WORD;
    Reserved1       : WORD;
    wBeginYear      : WORD;
    wBeginMonth     : WORD;
    wBeginDay       : WORD;
    wEndYear        : WORD;
    wEndMonth       : WORD;
    wEndDay         : WORD;
    wStartHour      : WORD;
    wStartMinute    : WORD;
    MinutesDuration : DWORD;
    MinutesInterval : DWORD;
    rgFlags         : DWORD;
    TriggerType     : TASK_TRIGGER_TYPE;
    AnyType         : TTriggerTypeUnion;
    Reserved2       : WORD;
    wRandomMinutesInterval: WORD;
  end;
A cbTriggerSize mezőben meg kell adni a rekord méretét. A wBeginYear, wBeginMonth és wBeginDay az időzítés kezdetének dátumát tartalmazza (év, hó, nap). A wEndYear, wEndMonth és wEndDay az időzítés befejezésének dátumát tartalmazza (év, hó, nap). A wStartHour és wStartMinute mezőkben a kezdés időpontját adhatjuk meg (óra, perc). A MinutesDuration mezőben megadhatjuk azt az időtartamot percben, amennyi ideig a feladat futhat. A mező értékének nagyobbnak, vagy egyenlőnek kell lennie a MinutesInterval mező értékénél. A MinutesInterval mező tartalmazza azt, hogy hány percenként kell futtatni, a kezdés időpontja és a MinutesDuration által meghatározott időintervallumban a feladatot. Ha azt akarjuk, hogy óránként egyszer lefusson, akkor ebben a mezőben 60-at kell megadni.
Az rgFLags mezőben a következő tulajdonságokat tudjuk megadni:
  • TASK_TRIGGER_FLAG_HAS_END_DATE: ha ez a flag be van állítva, akkor a feladat csak a meghatározott időpontig futhat, ellenkező esetben a befejezés időpontja nincs meghatározva.
  • TASK_TRIGGER_FLAG_KILL_AT_DURATION_END: ha a flag be van állítva, akkor a feladat futását befejezi, amikor a MinutesDuration mezőben meghatározott időtartamot túllépi. Ha lehetséges, akkor ezt úgy oldja meg, hogy küld egy WM_CLOSE üzenetet az alkalmazásnak, vagy ha ez nem lehetséges (pl. nincs az alkalmazásnak ablaka), akkor a TerminateProcess függvénnyel zárja be.
  • TASK_TRIGGER_FLAG_DISABLED: ha ez a flag be van állítva, akkor a feladat ki van kapcsolva, nem fog futni.
A TriggerType mezőben határozhatjuk meg a trigger típusát. Ezt a következő konstansok egyikével adhatjuk meg:
  • TASK_TIME_TRIGGER_ONCE: csak egyszer fut le, a megadott időpontban;
  • TASK_TIME_TRIGGER_DAILY: napi rendszerességgel, bizonyos számú naponként fut (lásd lejjebb a TDaily struktúrát);
  • TASK_TIME_TRIGGER_WEEKLY: meghatározott hónapok, meghatározott hetének adott napjain fut (lásd lejjebb a TWeekly struktúrát);
  • TASK_TIME_TRIGGER_MONTHLYDATE: hónap adott napjain fut (lásd lejjebb a TMonthlyDate struktúrát);
  • TASK_TIME_TRIGGER_MONTHLYDOW: adott hónapban, héten és napon fut (lásd lejjebb a TMonthlyDow struktúrát);
  • TASK_EVENT_TRIGGER_ON_IDLE: akkor fut, ha a rendszer egy adott időpontig üresjáratban van;
  • TASK_EVENT_TRIGGER_AT_SYSTEMSTART: a rendszer elindulásakor fut;
  • TASK_EVENT_TRIGGER_AT_LOGON: a bejelentkezéskor fut;
A TriggerType mező határozza meg, hogy az AnyType TTriggerTypeUnion típusú struktúra melyik részét kell figyelembe venni. Ez a struktúra négyféle lehet, attól függően, hogy milyen időzítést használunk. Ha az időzítés napi rendszerességgel történik, akkor a TDaily struktúrát kell használnunk, ami a következőképpen néz ki:
  TDaily = record
    DaysInterval: WORD;
  end;
A DaysInterval mezőben megadhatjuk, hogy a feladat hány naponként induljon el.
Ha a feladatot bizonyos számú hetenként, a hét adott napján kell elindítani, akkor a TWeekly struktúrát töltsük ki:
  TWeekly = record
    WeeksInterval: WORD;
    rgfDaysOfTheWeek: WORD;
  end;
A WeeksInterval mezőben megadhatjuk, hogy hány hetenként, az rgfDaysOfTheWeek mezőben pedig, hogy a hét mely napjain kell a feladatot indítani. Ez utóbbinál az alábbi konstansok kombinációját használhatjuk:
  • TASK_SUNDAY: vasárnap;
  • TASK_MONDAY : hétfő;
  • TASK_TUESDAY: kedd;
  • TASK_WEDNESDAY: szerda;
  • TASK_THURSDAY: csütörtök;
  • TASK_FRIDAY: péntek;
  • TASK_SATURDAY: szombat;
Ha egy vagy több hónap bizonyos napjain kell indítani a feladatot, akkor a TMonthlyDate struktúrát kell használni:
  TMonthlyDate = record
    rgfDays: DWORD;
    rgfMonths: WORD;
  end;
Az rgfDays mezőben adhatjuk meg, hogy a hónap mely napjain futhat a feladat. A mező minden bitje egy-egy naphoz tartozik, így a 0. bit az 1., az 1-je bit a 2-a, stb. Ha például azt akarjuk, hogy a megadott hónapok 1. és 10. napján fusson a feladat, akkor a 2^0 + 2^9 = 1+512 = 513 értéket kell megadnunk. Az rgfMonths mezőben az alábbi konstansok kombinációjával adhatjuk meg, hogy mely hónapokban kell a feladatot futtatni:
  • TASK_JANUARY
  • TASK_FEBRUARY
  • TASK_MARCH
  • TASK_APRIL
  • TASK_MAY
  • TASK_JUNE
  • TASK_JULY
  • TASK_AUGUST
  • TASK_SEPTEMBER
  • TASK_OCTOBER
  • TASK_NOVEMBER
  • TASK_DECEMBER
A fentieknél még összetettebb időzítést határozhatunk meg a TMontlhyDow struktúrával:
  TMonthlyDow = record
    wWhichWeek: WORD;
    rgfDaysOfTheWeek: WORD;
    rgfMonths: WORD;
  end;
A wWhichWeek mezőben megadhatjuk, hogy a hónap mely hetén futhat a task. Ezt az alábbi konstansok egyikével határozhatjuk meg (ezeket nem lehet kombinálni):
  • TASK_FIRST_WEEK: első héten;
  • TASK_SECOND_WEEK: második héten;
  • TASK_THIRD_WEEK: harmadik héten;
  • TASK_FOURTH_WEEK: negyedik héten;
  • TASK_LAST_WEEK: utolsó héten.
AZ rgfDaysOfTheWeek mezőben megadhatjuk a hét napjait, ugyanúgy, mint a TWeekly struktúránál, az rgfMonths mezőben pedig a hónapokat ugyanúgy, mint a TMonthlyDate struktúrában.
Paraméterek
const pTrigger: TTaskTrigger
A paraméter az időzítés adatait tartalmazó TTaskTrigger struktúrára mutató pointer.
GetTrigger
Osztály: ITaskTrigger
function GetTrigger(
out pTrigger: TTaskTrigger
): HRESULT;
Lekérdezi a trigger időzítési beállításait egy TTaskTrigger típusú struktúrába (lásd SetTrigger függvény).
Paraméterek
out pTrigger: TTaskTrigger
Ebben a paraméterben kapjuk meg az adatokat.
GetTriggerString
Osztály: ITaskTrigger
function GetTriggerString(
out ppwszTrigger: PWideChar
): HRESULT;
Lekérdezi a megadott sorszámú trigger adatait szöveges formában. Ez csak arra jó, hogy a felhasználóval egyszerűen közöljük a feladat indításainak időpontjait.
Paraméterek
out ppwszTrigger: PWideChar
Ebben a paraméterben kapjuk meg a sztringet.

ITaskScheduler cikksorozat