我用的SDK是 UIQ 3.1。在一个叫Progress的工程中,我在CProGressView类里面定义了一个CPeriodic对象iTimer。下面是部分代码:
- C/C++ code
void CProgressView::HandleCommandL(CQikCommand& aCommand) { switch (aCommand.Id()) { case EProgressInfoPrint1Cmd: { break; } case EProgressInfoPrint2Cmd: { iTimer->Start(1000,1000,TCallBack(CallTimer,this)); break; } case EProgressInfoPrint3Cmd: { break; } // Go back and exit command will be passed to the CQikViewBase to handle. default: CQikViewBase::HandleCommandL(aCommand); break; } }
iTimer调用了CallBack函数 CallTimer,其中CallTimer定义如下:
- C/C++ code
TInt CProgressView::CallTimer(TAny *aThis) { CProgressView* self=static_cast<CProgressView*>(aThis); self->OnTimer(); }void CProgressView::OnTimer() { if(iTimerTick==0) //iTimerTick为计数器,初始值为0 { CLabelDialog::RunDlgLD(); //创建一个对话框CLabelDialog,CLabelDialog为自己定义的一个对话框类。 } iTimerTick++; }
程序编译没问题,但在模拟器上面跑,iTimer调用start()之后,对话框被创建出来但不能响应任何事件,过了7秒左右就弹出一个对话框说CONE 44。我查了以下CONE 44是企图销毁尚存留在控件栈里面的控件,但问题是我并没有手动删除任何东西。这个问题搞了半天没有头绪,请高人指点!
------解决方案--------------------------------------------------------
Hi,
我感觉iTimerTick并没有起到预期的作用,导致Dialog弹出后Timer仍然在不停地触发,因此不停地弹出新的Dialog。
试着在OnTimer()的最开始加上停止Timer的代码,然后弹出对话框。
void CProgressView::OnTimer()
{
iTimer->Cancel();
CLabelDialog::RunDlgLD();
}
与本贴主题无关的一个问题是,由于OnTimer()调用了可能leave的函数,所以它也可以加上L后缀,相应地CallTimer()里加上TRAP语句。
Regards
Ziteng Chen