1

編集:コードを少し編集して、コードの「すべて」を大まかに把握しました。多分これは問題を特定するのに役立つかもしれません;)

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にどのように影響するかわかりません。

誰かが私を正しい方向に向けることができれば素晴らしいでしょう。

ありがとう

4

3 に答える 3

1

これは、別のアクティブなオブジェクト (これら 2 つのうちの 1 つ以外) が完了するか、SetActive() が呼び出されないことに問題がある可能性があります。Forum Nokiaを参照してください。すべてのコードを見ずに言うのは難しいです!

ところで User::WaitForRequest() は、ほとんどの場合、悪い考えです。理由はこちらをご覧ください。

于 2009-09-24T09:25:45.213 に答える
0

アクティブなオブジェクトと を混在させないでくださいUser::WaitForRequest()

(まあ、ほとんどありません。自分が何をしているのかを正確に知っていれば問題ありませんが、投稿したコードは、まだやるべきことを学ぶ必要があることを示唆しています。)

RThread::RequestComplete()スレッド要求セマフォが非同期サービス プロバイダーによってシグナル通知され、セマフォで待機していたアクティブ スケジューラが、呼び出し可能になるUser::WaitForAnyRequest()ように完了したアクティブ オブジェクトを探しようとしたRunL()が、見つからない場合、漂遊シグナル パニックが発生します。アクティブなオブジェクトのリストのいずれか。

この場合、進行中の 2 つのリクエストがあり、どちらもアクティブなスケジューラによって制御されません (たとえば、 として使用CActive::iStatusしない; 非同期リクエストに関与していないオブジェクトでTRequestStatus発行することは、コード内の別のエラーですが、その理由ではありません)。ストレイ信号)。どちらかが完了するのを待ちますが、もう一方が完了するのをまったく待ちません。他のリクエストの完了シグナルは、アクティブなスケジューラーのに送られ、その結果、シグナルが迷走します。リクエストをキャンセルした場合でも、スレッド リクエスト セマフォで待機する必要があります。SetActive()CActive::iStatusWaitForRequest()WaitForAnyRequest()

最善の解決策は、タイムアウト タイマーもアクティブなオブジェクトにすることです。CTimerクラスを見てください。

WaitForRequest別の解決策は、まだ完了していないリクエストに別のソリューションを追加することです。

于 2009-09-24T11:26:33.863 に答える
0

呼び出していますが、 に設定されてTestActiveObject::SetActive()いるメソッドへの呼び出しはありません。これにより、浮遊信号パニックが発生します。TestActiveObject::iStatusKRequestPending

コード内の唯一のiStatus変数は、CheckTCPSocket()メソッドに対してローカルです。

于 2009-09-28T19:25:10.483 に答える