1
CTimer 클래스에서 파생 된 클래스가 있습니다. CTimer :: After() 메서드를 주기적으로 호출하기 위해 데이터 멤버로 RThread 인스턴스가 있습니다. 코드는 다음과 같습니다 나는 StartL을 실행하면() 나는 항상 데이터 중단 예외가을 발생했습니다 을 얻을활성 객체 내부에서 스레드 실행
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;
}
. 문제가 무엇입니까?
안녕하세요 @laalto 나는 또한 ThreadFunction()에서 활성 스케줄러를 사용했지만 패닉이 다시 발생했습니다. 또한, 활성 개체 인 CTimerThread에서 새 스레드를 실행합니다. 이것은 정확히 노키아 예제 중 하나와 같습니다 [http] http://www.forum.nokia.com/info/sw.nokia.com/id/db839245-80fb-4a77-8e9a-35d1568310c3/S60_Platform_Multiple_Threads_Example_v1_1.zip.html. – user1027344
@ user1027344 다른 스레드의 활성 객체를 사용할 수 없습니다. 이 예제에서 CTimer 액티브 오브젝트를 링크 한 것은 메인 애플리케이션 스레드 (앱 프레임 워크가 사용자를 위해 활성 스케줄러를 생성하는 곳)에 있다는 점에 유의하십시오. 다른 스레드 자체는 활성 객체를 사용하지 않습니다. – laalto
안녕 내가 가진 시나리오는 아래와 같습니다 : C_AO_Class와 같은 활성 개체와 데이터 멤버로 RThread를 가진 CMyClass와 같은 클래스가 있습니다. 내부적으로 그리고 주기적으로 스레드를 실행하여 비동기 요청을하는 C_AO_Class :: Foo() 메서드를 호출하려고합니다. 어떻게해야합니까? 비동기 요청을하지 않는 C_AO_Class의 또 다른 메소드를 호출하면 잘 동작합니다. – user1027344