了解RProperty IPC通信

时间:2012-03-21 23:49:27

标签: c++ ipc symbian

我正在研究source base。基本上这是Symbian 3rd Edition的Anim服务器客户端,用于抓取输入事件而不会以可靠的方式使用它们。

如果你发现this line of the server,这里基本上是设置RProperty值(显然是增加一个计数器);似乎没有对输入进行实际处理。

this client line内,客户端应该接收通知数据,但它只调用Attach。

我的understanding is that Attach只需要调用一次,但在客户端不清楚每次服务器设置RProperty时触发的事件

客户端应该如何(以及在​​哪里)访问RProperty值?

1 个答案:

答案 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();
    }