2010-02-05 4 views
0

내가 IMAP4 메시지를 표시하려면이 코드를 사용하고 있습니다 : 사용자가 원격 메시지를 다운로드하려고 할 때 경우에,원격 이메일 메시지를 표시하는 방법은 무엇입니까?

void DisplayMessageL(const TMsvId &aId) 
     { 
     // 1. construct the client MTM 
     TMsvEntry indexEntry; 
     TMsvId serviceId; 
     User::LeaveIfError(iMsvSession->GetEntry(aId, serviceId, indexEntry)); 
     CBaseMtm* mtm = iClientReg->NewMtmL(indexEntry.iMtm); 
     CleanupStack::PushL(mtm); 

     // 2. construct the user interface MTM 
     CBaseMtmUi* uiMtm = iUiReg->NewMtmUiL(*mtm); 
     CleanupStack::PushL(uiMtm); 

     // 3. display the message 
     uiMtm->BaseMtm().SwitchCurrentEntryL(indexEntry.Id()); 
     CMsvOperationWait* waiter=CMsvOperationWait::NewLC(); 
     waiter->Start(); //we use synchronous waiter 
     CMsvOperation* op = uiMtm->OpenL(waiter->iStatus); 
     CleanupStack::PushL(op); 
     CActiveScheduler::Start(); 

     // 4. cleanup for example even members 
     CleanupStack::PopAndDestroy(4); // op,waiter, mtm, uimtm 
     } 

하지만 (즉, 이전에 메일 서버에서 검색되지 이메일 중 하나) 한 다음 취소 요청은 내 코드가 차단 된 채로 남아 있으며 작업이 취소되었다는 정보를받지 못합니다.

내 질문은 :

  • 무엇 위의 해결 방법은, 그래서 응용 프로그램이 붙어하지?
  • 누구나 공황 상태에 빠뜨리거나 응용 프로그램을 중단시키지 않는 원격 메시지 열기를위한 비동기 호출에 대한 작업 예제를 제공 할 수 있습니까?

POP3, SMTP 및 로컬 IMAP4 메시지의 비동기 호출은 완벽하게 작동하지만 원격 IMAP4 메시지는이 문제를 생성합니다.

나는이 예제를 S60 제 5 판에 테스트 중이다.

감사합니다.

+0

괜찮습니다.이 모든 것이 잘못되었습니다. DisplayMessageL에 도달하면 이미 활성 스케줄러에서 실행 중이어야합니다. 전체 애플리케이션 구조가 잘못되었다고 생각합니다. –

+0

이것은 내 응용 프로그램이 아닙니다. 나는 단지 원격 IMAP4 메시지를 열 수있는 예제를 찾고있다. 내 질문에 말했듯이, 나는 CMsvOperation과 비동기 호출을 사용하는 데 아무런 문제가 없었지만, IMAP4 메시지에 대해서는 전혀 작동하지 않습니다. 이제는 동 기적으로 작동하는지 확인하기 위해 예제를 재사용하고 있습니다. 비동기식 예제를보기가 정말 기쁩니다. –

답변

0

먼저, CMsvOperationWait을 제거하고 비공개 적으로 열기 요청을 처리합니다. 즉, CMsvOperation이 완료 될 때까지 대기중인 활성 개체가 있어야합니다.

CMsvOperationWait은 비동기 작업을 동기식으로 보이게하는 편의성에 불과하며 내 생각에 이것이 범인이라는 것입니다. 다운로드 -> 쇼 메시지의 경우 두 개의 비동기 작업이 연결되어 있습니다.

+0

비동기 호출을 시도하고 CActiveScheduler :: Start()를이 예제의 루프에 유지하려고 시도했지만 실제 문제는 다운로드 작업 취소가 이벤트를 생성하지 않는 것입니다. –