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

如果发现this line of the server,则基本上是在设置RProperty值(显然是递增的计数器)。似乎没有实际的输入处理完成。

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

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

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

最佳答案

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

关于c++ - 了解RProperty IPC通讯,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9814542/

10-11 21:29