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 版测试这些示例。

谢谢大家。

4

1 回答 1

0

首先,我将重试删除CMsvOperationWait并异步处理打开请求——即有一个活动对象等待 CMsvOperation 完成。

CMsvOperationWait无非是使异步操作显示为同步的便利,我怀疑这是罪魁祸首-在下载->显示消息的情况下,有两个异步操作链接在一起。

于 2010-02-05T08:15:10.350 回答