如果你发现this line of the server,这里基本上是设置RProperty值(显然是增加一个计数器);似乎没有对输入进行实际处理。
在this client line内,客户端应该接收通知数据,但它只调用Attach。
我的understanding is that Attach只需要调用一次,但在客户端不清楚每次服务器设置RProperty时触发的事件
客户端应该如何(以及在哪里)访问RProperty值?
答案 0 :(得分:1)
在Attach
客户端将Subscribe
某处传递到TRequestStatus
引用的属性之后。当异步事件发生时(在您的情况下属性已更改),服务器将通过内核发出请求状态属性的信号。如果您的示例源代码以正确的方式实现,您将找到一个活动对象(AO; CActive
派生类),并且此AO的iStatus
将传递给RProperty API。在这种情况下,当属性发生变化时,将调用AO的RunL
函数。
Symbian必须理解活动对象框架,实际上很少有人这样做。不幸的是我没有在网上找到一个非常好的描述(他们在Symbian OS Internals书中得到了很好的解释)但是this page至少给你一个简单的例子。
示例强>
在ConstructL
的CMyActive子类的CActive
中:
CKeyEventsClient* iClient;
RProperty iProperty;
// ...
void CMyActive::ConstructL()
{
RProcess myProcess;
TSecureId propertyCategory = myProcess.SecureId();
// avoid interference with other properties by defining the category
// as a secure ID of your process (perhaps it's the only allowed value)
TUint propertyKey = 1; // whatever you want
iClient = CKeyEventsClient::NewL(propertyCategory, propertyKey, ...);
iClient->OpenNotificationPropertyL(&iProperty);
// ...
CActiveScheduler::Add(this);
iProperty.Subscribe(iStatus);
SetActive();
}
更改属性后将调用RunL:
void CMyActive::RunL()
{
if (iStatus.Int() != KErrCancel) User::LeaveIfError(iStatus.Int());
// forward the error to RunError
// "To ensure that the subscriber does not miss updates, it should
// re-issue a subscription request before retrieving the current value
// and acting on it." (from docs)
iProperty.Subscribe(iStatus);
TInt value; // this type is passed to RProperty::Define() in the client
TInt err = iProperty.Get(value);
if (err != KErrNotFound) User::LeaveIfError(err);
SetActive();
}