WaitForRequest with Timeout崩溃

时间:2009-09-23 15:01:39

标签: c++ symbian active-objects

编辑:我现在已经编辑了一些代码,以便大致了解“所有”代码。也许这个 可能有助于确定问题;)

我已经集成了以下简单的代码片段,如果数据则取消定时器 从TCP套接字读取,否则它取消从套接字读取的数据

// file tcp.cpp
void CheckTCPSocket()
{
TRequestStatus iStatus;
TSockXfrLength len;

int timeout = 1000;
RTimer timer;
TRequestStatus timerstatus;

TPtr8 buff;
iSocket.RecvOneOrMore( buff, 0, iStatus, len );

timer.CreateLocal();

timer.After(timerstatus, timeout);
// Wait for two requests – if timer completes first, we have a
// timeout.
User::WaitForRequest(iStatus, timerstatus);

if(timerstatus.Int() != KRequestPending)
{
  iSocket.CancelRead();
}
else
{
  timer.Cancel();
}
timer.Close();
}

// file main.cpp
void TestActiveObject::RunL()
{
  TUint Data;
  MQueue.ReceiveBlocking(Data);
  CheckTCPSocket();
  SetActive();
}

这部分是在活动对象中执行的,因为集成上面的代码片段,我总是得到内核恐慌: E32User-CBase 46:这种恐慌是由一个活动的调度程序CActiveScheduler引发的。它是由杂散信号引起的。

我的代码从来没有遇到任何问题,直到现在执行这段代码;代码执行正常,因为从套接字读取数据 然后取消并关闭计时器。我不明白计时器对象如何对AO产生任何影响。

如果有人能指出我正确的方向,会很棒。

由于

3 个答案:

答案 0 :(得分:1)

这可能是另一个活动对象完成(不是这两个中的一个)或SetActive()未被调用的问题。见Forum Nokia。很难说没有看到你的所有代码!

BTW User :: WaitForRequest()几乎总是一个坏主意。请参阅why here

答案 1 :(得分:0)

切勿混合活动对象和User::WaitForRequest()

(好吧,几乎从来没有。当你确切知道自己在做什么时就可以了,但你发布的代码表明你还有一些学习要做。)

当异步服务提供程序通过RThread::RequestComplete()发出线程请求信号量并且等待User::WaitForAnyRequest()信号量的活动调度程序尝试查找活动对象时,会出现杂散信号混乱已完成,以便可以调用其RunL(),但在其活动对象列表中找不到任何内容。

在这种情况下,您有两个正在进行的请求,这两个请求都不受活动调度程序控制(例如,不使用CActive::iStatus作为TRequestStatus;在对象上发出SetActive() CActive::iStatus未参与异步请求是代码中的另一个错误,但不是杂散信号的原因)。您等待其中任何一个完成WaitForRequest(),但不要等到另一个完成。另一个请求的完成信号将转到活动调度程序的WaitForAnyRequest(),从而产生杂散信号。如果取消请求,您仍需要等待线程请求信号量。

最佳解决方案是将超时计时器也设置为活动对象。看看CTimer课程。

另一种解决方案是在尚未完成的请求上添加另一个WaitForRequest

答案 2 :(得分:0)

您正在呼叫TestActiveObject::SetActive(),但没有调用将TestActiveObject::iStatus设置为KRequestPending的任何方法。这将造成杂散信号恐慌。

代码中唯一的iStatus变量是CheckTCPSocket()方法的本地变量。