Запустить поток внутри активного объекта
У меня есть класс, который является производным от класса CTimer. У меня есть экземпляр RThread в качестве члена данных, чтобы периодически вызывать метод CTimer::After(). Код является:
void CTimerThread::RunL()
{
qDebug() << "Value=" << ++iCounter;
if (iThread->ExitType() == EExitKill)
{
if (KErrNone == CreateThread())
iThread->Resume();
}
}
void CTimerThread::StartL()
{
qDebug() << "In the StartL( );";
if(isThreadCreated == EFalse)
User::LeaveIfError(CreateThread ());
iThread->Resume();
}
TInt CTimerThread::ThreadFunction(TAny *sender)
{
CTrapCleanup* cleanupStack = CTrapCleanup::New();
CTimerThread* host = (CTimerThread*)sender;
forever {
host->After(host->iInterval->Int());
if (!host->isSchedulStarted)
{
CActiveScheduler::Start();
host->isSchedulStarted = ETrue;
}
}
delete cleanupStack;
return 1;
}
TInt CTimerThread::CreateThread()
{
TInt err = KErrNone;
_LIT(KNameBase, "Thread_");
TBuf<10> name(KNameBase);
name.AppendNum(iCounter);
err = iThread->Create(name, CTimerThread::ThreadFunction, 4096, NULL, this);
if( err == KErrNone)
isThreadCreated = ETrue;
return err;
}
Когда я выполняю StartL(), я всегда получаю исключение при сбое данных. в чем проблема?
1 ответ
Активные объекты по своей природе специфичны для потока, так как для сигнализации они используют семафор потока (User::WaitForRequest()
, User::RequestComplete()
так далее.). Вы не можете напрямую вызывать активные объекты другого потока.
Другая проблема: в вашем потоке не установлен активный планировщик. Если вы планируете использовать активные объекты во вновь созданном потоке, CActiveScheduler::Install()
сначала активный планировщик.