塞班RThread的问题

Problem with Symbian RThread

本文关键字:问题 RThread 塞班      更新时间:2023-10-16

我有这样的代码:

void MyAppAppUi::ConstructL()
{
    _LIT(KString1, "asd");
    TBuf<15> buf1(KString1);
    TInt iStackSize = 32000;
    RThread iThread;
    TInt err = iThread.Create(
                buf1,
                func,
                iStackSize,
                NULL,
                NULL
               );
    iThread.Resume();
}
TInt func(TAny *obj)
{
    CAknInformationNote* note = new(ELeave)CAknInformationNote;
    TBuf<32> msg;
    msg.Format(_L(" rasdasd "));
    note->ExecuteLD(msg);
}

和头文件中的

        friend TInt func(TAny *obj);

问题是它没有进入函数:func

err = KErrNone

我认为线程正在运行,但问题是你正在运行的是失败的

主要问题是你试图在另一个线程中做UI代码。这通常是行不通的,在主线程上创建所有UI。所以你的代码无论如何都不会工作。

你还需要学习Symbian的概念,比如资源管理(清理堆栈)和活动对象。

一般来说,当你启动一个Symbian线程时,你需要用标准的Symbian基础设施来设置线程。你几乎总是需要在新线程上设置一个清理堆栈,你可能需要选择性地设置一个ActiveScheduler(尽管在启动ActiveScheduler之前你至少需要一个活动对象)。

查看这个诺基亚RThread示例,了解如何创建和管理线程。

把这个例子分解一下:

您需要清理堆栈基础结构:

TInt ThreadFunction(TAny* aParams)
    {
    // 1. Add cleanup stack support.
    CTrapCleanup* cleanupStack = CTrapCleanup::New();
    // 2. Get pointer to thread host
    CMyThread* host = (CMyThread*)aParams;
    TRAPD(err,
... your code here ...
        );
    host->ThreadExecuted(err);
    delete cleanupStack;
    return KErrNone;
    }

如果你需要使用活动对象,你还需要设置activesscheduler:

TInt ThreadFunction(TAny* aParams)
    {
    // 1. Add cleanup stack support.
    CTrapCleanup* cleanupStack = CTrapCleanup::New();
    // 2. Get pointer to thread host
    CMyThread* host = (CMyThread*)aParams;
    TRAPD(err,
        // 3. Add support for active objects
        CActiveScheduler* activeScheduler = new (ELeave) CActiveScheduler;
        CleanupStack::PushL(activeScheduler);
        CActiveScheduler::Install(activeScheduler);
        // 4. Create and start your active object here
..... you active object goes stuff here
        // NOTE: When adding CActiveScheduler support for threads we have to
        // add atleast one active object in it or it fails on 
        // CActiveScheduler::Start().
        // CPeriodic is derived from CActive active object so that is good for
        // this example.
        // 5. --> Thread execution starts
        CActiveScheduler::Start();
        // 6. --> Thread execution ends (waiting for CActiveScheduler::Stop())
        CleanupStack::PopAndDestroy(... your active object here....);
        CleanupStack::PopAndDestroy(activeScheduler);
        );
    host->ThreadExecuted(err);
    delete cleanupStack;
    return KErrNone;
    }