Проблема с Symbian RThread - PullRequest
0 голосов
/ 13 июля 2011

У меня есть этот код:

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

1 Ответ

1 голос
/ 15 июля 2011

Я думаю, что поток запущен, но проблема в том, что у вас не получается.

Основная проблема заключается в том, что вы пытаетесь создать код пользовательского интерфейса в другом потоке. Как правило, это не сработает, создайте все элементы пользовательского интерфейса в основном потоке. Так что ваш код никогда не будет работать в любом случае.

Также вам необходимо узнать о концепциях Symbian, таких как управление ресурсами там (стек очистки) и активные объекты.

Обычно при запуске потока Symbian необходимо настроить поток со стандартной инфраструктурой Symbian. Почти всегда вам нужно настроить стек очистки в новом потоке, и вам может потребоваться дополнительно установить ActiveScheduler (хотя вам нужен хотя бы один активный объект перед запуском ActiveScheduler).

См. Пример Nokia 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;
    }

Если вам нужно использовать активные объекты, вам также нужно настроить ActiveScheduler:

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;
    }
...