我正在研究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/