編集:コードを少し編集して、コードの「すべて」を大まかに把握しました。多分これは問題を特定するのに役立つかもしれません;)
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-CBase46:このパニックは、アクティブスケジューラであるCActiveSchedulerによって発生します。漂遊信号が原因です。
このコードが実行されるまで、コードに問題はありませんでした。データがソケットから読み取られ、タイマーがキャンセルされて閉じられるため、コードは正常に実行されます。ここでタイマーオブジェクトがAOにどのように影響するかわかりません。
誰かが私を正しい方向に向けることができれば素晴らしいでしょう。
ありがとう