编辑:我现在已经对我的代码进行了一些编辑,以便对“所有”代码有一个粗略的了解。也许这可能有助于识别问题;)
我已经集成了以下简单的代码片段,如果从 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 产生任何影响。
如果有人能指出我正确的方向,那就太好了。
谢谢