편집 : 코드를 "모두"대략적으로 편집하기 위해 코드를 편집했습니다. 어쩌면이 문제를 식별하는 데 도움이 될 수 있습니다, 나는 소켓에서 읽을 데이터를 데이터 는 TCP 소켓에서 읽거나 그렇지 않으면 취소하는 경우 중 하나 타이머를 취소 다음과 같은 간단한 코드의 fragment를 통합 한WaitForRequest with Timeout crack
)
E32User-CBase 46 : :이 패닉 상태가 활성 스케줄러하는 CActiveScheduler에 의해 제기되고 난 항상 커널 패닉을 얻을 위에// 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();
}
이 부분은 활성 객체 내에서 코드 조각을 통합 이후 실행됩니다. 이 신호는 표류 신호로 인해 발생합니다.
지금까지이 코드가 실행될 때까지 내 코드에 어떤 문제도 없었습니다. 소켓에서 데이터를 읽을 때 코드가 잘 실행되고 타이머가 취소되고 닫힙니다. 타이머 객체가 AO에 어떤 영향을 미치는지 이해할 수 없습니다.
누군가가 올바른 방향으로 나를 가리킬 수 있다면 좋을 것입니다.
감사
답변 해 주셔서 감사합니다. 문제는 다음 요청을 선행하기 전에 들어오는 응답을 기다릴 필요가 있음을 의미하는 요청/응답 프로토콜이 있다는 것입니다. 따라서 WaitForRequest() 포함! –
이를 달성하기 위해 WaitForRequest가 필요하지 않습니다. 액티브 오브젝트 상태 머신이 반드시 트릭을 수행합니다. WaitForRequest는 어떤 댓가를 치르더라도 피해야합니다 (Symbian OS 프로그래밍을 10 년 동안 사용해 본 적이 없었습니다 :-) – KevinD
Chees Kevin,하지만 테스트 목적으로 코드를 작성 했으므로 절대적으로 효율적이어서는 안됩니다. 신속하게 뭔가를 실행하는 것이 중요하며 내 문제에 대한 빠른 해결 방법이 있기를 바랍니다. 전체 구현을 다시 작성하고 싶지는 않습니다.) –