2010-02-05 76 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 5th版的這些例子。

謝謝大家提前。

+0

好的,這感覺都錯了。到達DisplayMessageL時,您應該已經在活動調度程序中運行了。我認爲你的整個應用程序結構出錯了。 – 2010-02-05 11:50:43

+0

這不是我的應用程序。我只是想找到一個可以打開遠程IMAP4消息的例子。正如我在我的問題中所說的那樣,我在使用異步調用ws/CMsvOperation時沒有問題,但對IMAP4消息來說這完全不起作用。現在,我正在重複使用一些示例來查看它是否可以同步工作。雖然我會很高興看到異步的例子。 – 2010-02-05 16:49:12

回答

0

首先,我會重試刪除CMsvOperationWait並異步處理打開的請求 - 即讓一個活動對象等待CMsvOperation完成。

CMsvOperationWait只不過是一個方便,使異步操作顯示同步,我懷疑這是罪魁禍首 - 在下載 - >顯示消息的情況下,有兩個異步操作鏈接。

+0

我嘗試過異步調用,並且我還試圖在本例中的循環中保留CActiveScheduler :: Start(),但真正的問題是取消下載操作似乎不會生成任何事件。 – 2010-02-05 10:27:20