我有一个派生自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()时,我总是得到发生数据中止异常。有什么问题?
答案 0 :(得分:0)
活动对象本质上是特定于线程的,因为它们依赖于线程信号量来发送信号(User::WaitForRequest()
,User::RequestComplete()
等)。您不能直接调用另一个线程的活动对象。
另一个问题:您的线程没有安装活动的调度程序。如果您计划在新创建的线程中使用活动对象,请先CActiveScheduler::Install()
一个活动的调度程序。