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
        }

ただし、ユーザーがリモート メッセージ (つまり、以前にメール サーバーから取得されていない電子メールの 1 つ) をダウンロードしようとして、要求をキャンセルした場合、私のコードはブロックされたままになり、アクションがキャンセルされたという情報を受け取ることはありません。

私の質問は:

  • 上記の回避策は何ですか。アプリケーションが動かなくなりますか?
  • アプリケーションをパニックやクラッシュさせないリモートメッセージを開くための非同期呼び出しの実際の例を誰かが提供できますか?

POP3、SMTP、およびローカル IMAP4 メッセージの非同期呼び出しは完全に機能しますが、リモート IMAP4 メッセージはこの問題を引き起こします。

これらの例を S60 第 5 版でテストしています。

よろしくお願いします。

4

1 に答える 1

0

まず、削除を再試行CMsvOperationWaitし、オープン リクエストを非同期的に処理します。つまり、CMsvOperation の完了を待機するアクティブなオブジェクトを用意します。

CMsvOperationWait非同期操作を同期的に見せるための便利なだけであり、これが原因であると私は疑っています.download->showメッセージの場合、2つの非同期操作が連鎖しています。

于 2010-02-05T08:15:10.350 に答える