Symbian里面,比较常用的定时器是 CPeriodic,其实也就是由 CTimer 实现的,而CTimer 则是一个 活动对象(Active Object)。
通过查看源代码发现,活动对象所被调用的最小时间片是取自 User::TickCount()。
在SDK中,User::TickCount()的注释如下:
static IMPORT_C TUint TickCount();
Description
Gets the current tick count.
The period between ticks is usually 1/64 second, but may be hardware dependent.
Return value
也就是说,每次活动对象最小的时间间隔将会是 1/64 秒。
我尝试过将CPeriodic的时间间隔分别设 1000000/33 和 1000000/31 微秒,而通过计算其时间间隔,可以发现两者足足有1倍的差别。
这个最小时间片也限制了 CTimer的精度,它的间隔只能是 1/64 秒的 倍数。
这就意味着,活动对象并不适合于短时间执行的任务。
一个比较好的例子就是 CImageDecoder 。
它使用活动对象来进行异步解码,但是当图片很小的时候,解码时间不足1/64秒,那么时间就被白白浪费了。
同步解码是一个不错的选择。