×
Namespaces

Variants
Actions
Revision as of 11:15, 23 May 2008 by aknyman (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Archived:Creating a condition-based schedule with RScheduler

From Nokia Developer Wiki
Jump to: navigation, search


ID   Creation date May 23, 2008
Platform S60 3rd Edition, FP1 Tested on devices Nokia N93
Category Symbian C++ Subcategory Files/Data


Keywords (APIs, classes, methods, functions): RScheduler, TSchedulerItemRef, TTaskSchedulerCondition, TTaskInfo, TTsTime, RProperty, RScheduler::Connect(), RScheduler::Register(), RScheduler::Close(), RScheduler::CreatePersistentSchedule(), RScheduler::ScheduleTask(), TTsTime::SetLocalTime(), RProperty::Define(), RProperty::Set(), RProperty::Delete()

Overview

This code snippet shows how to create a condition based schedule using the class RScheduler. One condition based schedule can contain one or more TTaskSchedulerCondition schedule entries. An entry contains a criteria based on Publish and Subscribe variable and when this variable has certain value the Task Scheduler server launches scheduled tasks. The user can also give a default runtime for the tasks to run regardless of the condition variable values.

In this example a condition based schedule with one task is created. After that the Symbian Publish and Subscribe mechanism is used to trigger and execute the scheduled task.

This snippet can be self-signed.

MMP file

The following libraries are required:

LIBRARY             schsvr.lib

Preconditions

ExampleTaskHandler.exe must be created before this code snippet can be executed. See Creating_and_registering_a_task_handler_with_RScheduler


Resource files

.rss

RESOURCE MENU_PANE r_schedulerexample_menu
{
items =
{
//...
MENU_ITEM {command = ECreateConditionExample; txt = "CreateConditionExample";},
//...
MENU_ITEM {command = EAknSoftkeyExit; txt = "Exit";}
};
}

.hrh

enum TSchedulerExampleIds
{
//...
ECreateConditionExample,
//...
};

Header file

#ifndef __SCHEDULEREXAMPLEAPPUI_H__
#define __SCHEDULEREXAMPLEAPPUI_H__
 
#include <csch_cli.h> // RScheduler
#include <schinfo.h> // TSchedulerItemRef, TTaskInfo...
 
class CSchedulerExampleAppUi : public CAknAppUi
{
//...
public:
void HandleCommandL(TInt aCommand);
//...
private:
void CreateConditionVariableL();
 
void SetConditionVariableL(TInt aKeyValue);
 
void DeleteConditionVariableL();
 
TInt CreateConditionScheduleWithTaskL(TSchedulerItemRef& aSchedulerItem,
RScheduler& aScheduler,
const TUid& aConditionCategory,
TUint aConditionKey,
const TTsTime& aDefaultRunTime,
TInt& aNewTaskId);
 
//...
private:
 
RScheduler iScheduler;
 
TSchedulerItemRef iConditionScheduleHandle;
};
 
#endif // __SCHEDULEREXAMPLEAPPUI_H__


Source file

#include <e32property.h>
 
const TUid KExampleUid = TUid::Uid(0xE0060BBB); //UID3 from .mmp file
const TInt KExampleKey = 1;
 
void CSchedulerExampleAppUi::ConstructL()
{
//...
User::LeaveIfError(iScheduler.Connect());
 
_LIT(KExampleTaskHandlerExe, "ExampleTaskHandler.exe");
TFileName exampleHandler(KExampleTaskHandlerExe);
 
User::LeaveIfError(iScheduler.Register(exampleHandler, CActive::EPriorityStandard));
}
 
CSchedulerExampleAppUi::~CSchedulerExampleAppUi()
{
 
//...
iScheduler.Close();
 
DeleteConditionVariableL();
}
 
void CSchedulerExampleAppUi::HandleCommandL(TInt aCommand)
{
TBuf<100> Text1; //first line of dialog text
TBuf<100> Text2; //second line of dialog text
 
switch(aCommand)
{
case EEikCmdExit:
case EAknSoftkeyExit:
Exit();
break;
//...
case ECreateConditionExample:
{
TInt err(KErrNone);
 
//create condition variable for condition based schedule
CreateConditionVariableL();
 
TSchedulerItemRef conditionScheduleHandle;
 
TTsTime defaultTime;
TTime time;
time.HomeTime();
time = time.operator+(TTimeIntervalMonths(1));
defaultTime.SetLocalTime( time );
 
TInt newConditionTaskId=-1;
err = CreateConditionScheduleWithTaskL(iConditionScheduleHandle,
iScheduler, KExampleUid, KExampleKey, defaultTime, newConditionTaskId );
 
if(err == KErrNone)
{
Text1.Append(_L("ConditionTask:"));
Text1.AppendNum(newConditionTaskId);
Text1.Append(_L(" Scheduled"));
 
CEikonEnv::Static()->InfoWinL(Text1, _L(""));
 
//Set condition variable and trigger task scheduler to execute the example task
SetConditionVariableL(1);
}
else
{
//Creating condition schedule failed, do something...
}
}
break;
 
default:
//Panic(ESchedulerExampleUi);
break;
}
}
 
 
void CSchedulerExampleAppUi::CreateConditionVariableL()
{
TInt ret = RProperty::Define(KExampleUid, KExampleKey, RProperty::EInt);
 
if (ret != KErrAlreadyExists)
{
User::LeaveIfError(ret);
}
}
 
void CSchedulerExampleAppUi::SetConditionVariableL(TInt aKeyValue)
{
TInt ret = RProperty::Set(KExampleUid, KExampleKey, aKeyValue);
 
User::LeaveIfError(ret);
}
 
void CSchedulerExampleAppUi::DeleteConditionVariableL()
{
TInt ret = RProperty::Delete(KExampleUid, KExampleKey);
 
if (ret != KErrNotFound)
{
User::LeaveIfError(ret);
}
}
 
//create a condition based schedule with one example task
TInt CSchedulerExampleAppUi::CreateConditionScheduleWithTaskL(
TSchedulerItemRef& aSchedulerItem,
RScheduler& aScheduler,
const TUid& aConditionCategory,
TUint aConditionKey,
const TTsTime& aDefaultRunTime,
TInt& aNewTaskId)
{
TInt ret(KErrNone);
 
aSchedulerItem.iName = _L("Condition Schedule Example");
 
CArrayFixFlat<TTaskSchedulerCondition>* conditions =
new (ELeave) CArrayFixFlat<TTaskSchedulerCondition>(1);
 
CleanupStack::PushL(conditions);
TTaskSchedulerCondition exampleCondition;
exampleCondition.iCategory = aConditionCategory;
exampleCondition.iKey = aConditionKey;
exampleCondition.iState = 1;
exampleCondition.iType = TTaskSchedulerCondition::EEquals;
conditions->AppendL(exampleCondition);
 
ret = aScheduler.CreatePersistentSchedule(aSchedulerItem,
*conditions, aDefaultRunTime);
 
if (ret == KErrNone)
{
TTaskInfo taskInfo;
taskInfo.iTaskId = 0;
taskInfo.iName = _L("ExampleTask3");
taskInfo.iPriority = 2;
taskInfo.iRepeat = 0;
HBufC* data = _L("ExampleData3").AllocLC();
 
// schedule the example task
ret = aScheduler.ScheduleTask(taskInfo, *data, aSchedulerItem.iHandle);
 
aNewTaskId = taskInfo.iTaskId;
 
CleanupStack::PopAndDestroy(); // data
}
else
{
//Creating persistent schedule failed, do something...
}
 
CleanupStack::PopAndDestroy(); // conditions
 
return ret;
}


Postconditions

The condition based schedule with one example task is created and the task execution is triggered using Publish and Subscribe mechanism.

See also

124 page views in the last 30 days.
×