2009-09-23 2 views
1

편집 : 코드를 "모두"대략적으로 편집하기 위해 코드를 편집했습니다. 어쩌면이 문제를 식별하는 데 도움이 될 수 있습니다, 나는 소켓에서 읽을 데이터를 데이터 는 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에 어떤 영향을 미치는지 이해할 수 없습니다.

누군가가 올바른 방향으로 나를 가리킬 수 있다면 좋을 것입니다.

감사

답변

1

이 다른 활성 객체가없는 호출되는 (안이 두 가지 중 하나), 또는 SetActive() 완료에 문제가있을 수 있습니다. Forum Nokia을 참조하십시오. 모든 코드를 보지 않고 말하기 힘듭니다!

BTW 사용자 :: WaitForRequest()가 거의 입니다. 항상 나쁜 아이디어입니다. why here을 참조하십시오.

+0

답변 해 주셔서 감사합니다. 문제는 다음 요청을 선행하기 전에 들어오는 응답을 기다릴 필요가 있음을 의미하는 요청/응답 프로토콜이 있다는 것입니다. 따라서 WaitForRequest() 포함! –

+0

이를 달성하기 위해 WaitForRequest가 필요하지 않습니다. 액티브 오브젝트 상태 머신이 반드시 트릭을 수행합니다. WaitForRequest는 어떤 댓가를 치르더라도 피해야합니다 (Symbian OS 프로그래밍을 10 년 동안 사용해 본 적이 없었습니다 :-) – KevinD

+0

Chees Kevin,하지만 테스트 목적으로 코드를 작성 했으므로 절대적으로 효율적이어서는 안됩니다. 신속하게 뭔가를 실행하는 것이 중요하며 내 문제에 대한 빠른 해결 방법이 있기를 바랍니다. 전체 구현을 다시 작성하고 싶지는 않습니다.) –

0

액티브 개체와 User::WaitForRequest()을 절대로 혼합하지 마십시오. (당신은 당신이 그것을 확인 할 수 있습니다 일을 정확히 알고 있지만, 게시 코드는 여전히해야 할 몇 가지 학습을 제안합니다. 음, 거의 절대.)

당신은 때 부유 신호 공황을 얻을 쓰레드 요청 세마포어는 비동기 서비스 제공자에 의해 RThread::RequestComplete()으로 시그널링되고, User::WaitForAnyRequest()은 완료된 활성 객체를 찾기 위해 세마포어를 기다리고 있었지만, RunL()이 호출 될 수는 있지만 그 목록에서 아무 것도 찾을 수 없다. 활성 개체. 이 경우

활성 스케줄러에 의해 제어되는 어느 것도이 개 진행중인 요청을이 (예를 들어, TRequestStatusCActive::iStatus를 사용하지 않는, CActive::iStatus이 비동기 요청에 포함되지 않은 객체에 SetActive()를 발행하는 것은 또 다른 오류가 귀하의 코드에 있지만 빗나간 신호에 대한 이유는 아닙니다). 어느 하나가 WaitForRequest()으로 완료 될 때까지 기다리지 만 다른 하나가 완료되기를 기다리지 마십시오. 다른 요청의 완료 신호가 활성 스케줄러의 WaitForAnyRequest()으로 이동하여 신호가 누출됩니다. 요청을 취소하면 스레드 요청 세마포어를 기다려야합니다.

가장 좋은 해결책은 타임 아웃 타이머를 활성 객체로 만드는 것입니다. CTimer 클래스를 살펴보십시오.

또 다른 해결책은 아직 완료되지 않은 요청에 WaitForRequest을 추가하는 것입니다.

+0

이상한 일은 코드에서 User : WaitForRequest (iStatus) 문을 가지고 타이머를 빠져 나간 적이 전혀 없다는 것입니다. 이제 RTimer와 User :: WaitForRequest (iStatus, timerstatus)를 사용할 때 갑자기이 문제가 발생합니다. 이미이 문제가 발생해서는 안 되었습니까? 아니면 여러 요청이 보류 중일 때만 발생합니까? –

+0

문제를 더욱 명확히하기 위해 답변을 업데이트했습니다. – laalto

+0

감사합니다 laalto 그리고 예, 나는 Symbian의 전문가가되는 것과는 거리가 멀다는 것에 동의합니다! 좋아,이 행동은 내가 인정해야한다는 것을 놀라게한다. 요청을 취소하면 나중의 단계에서 고려할 필요가 없다고 생각했습니다. 즉, 타이머가 취소 된 경로에 또 다른 WaitForRequest를 추가해야합니다. 맞습니까? 그렇게함으로써, 나는 Timer의 RequestComplete()를 처리하고 액티브 오브젝트에서 에러를 얻지는 않는다. –

0

TestActiveObject::SetActive()으로 전화를 걸었으나 TestActiveObject::iStatus에서 KRequestPending으로 설정하는 방법은 호출 할 필요가 없습니다.이것은 길잃은 신호 패닉을 만듭니다.

코드의 iStatus 변수는 CheckTCPSocket() 메서드에만 국한됩니다.

+0

이것은 euser의 디버그 빌드에만 적용됩니다. winscw udeb 에뮬레이터, 릴리스 euser를 실행하는 대상 장치가 아닙니다. – laalto

+0

(오브젝트가 활성 스케줄러에 Add() 된 것으로 가정하십시오.) – laalto