2011-11-03 1 views
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; 
} 

. 문제가 무엇입니까?

답변

0

활성 객체는 신호 처리를 위해 스레드 세마포어 (, User::RequestComplete() 등)에 의존하기 때문에 본질적으로 스레드 고유입니다. 다른 스레드의 활성 객체를 직접 호출 할 수 없습니다.

또 다른 문제 : 스레드에 활성 스케줄러가 설치되어 있지 않습니다. 새로 생성 된 스레드에서 활성 객체를 사용하려는 경우 먼저 CActiveScheduler::Install() 활성 스케줄러를 사용하십시오.

+0

안녕하세요 @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

+0

@ user1027344 다른 스레드의 활성 객체를 사용할 수 없습니다. 이 예제에서 CTimer 액티브 오브젝트를 링크 한 것은 메인 애플리케이션 스레드 (앱 프레임 워크가 사용자를 위해 활성 스케줄러를 생성하는 곳)에 있다는 점에 유의하십시오. 다른 스레드 자체는 활성 객체를 사용하지 않습니다. – laalto

+0

안녕 내가 가진 시나리오는 아래와 같습니다 : C_AO_Class와 같은 활성 개체와 데이터 멤버로 RThread를 가진 CMyClass와 같은 클래스가 있습니다. 내부적으로 그리고 주기적으로 스레드를 실행하여 비동기 요청을하는 C_AO_Class :: Foo() 메서드를 호출하려고합니다. 어떻게해야합니까? 비동기 요청을하지 않는 C_AO_Class의 또 다른 메소드를 호출하면 잘 동작합니다. – user1027344