难道定时器受到内存的限制?

 

附注

全部代码贴在下面,也可以从以下地址下载VS2003 Projecthttp://zhangleixp.itpub.net/get/13774/WeirdTimer_SRC.rar

 

程序说明

1Start 方法可以有两种方式启动Do方法:

第一种是使用定时器,

第二种是不使用定时器,直接用一个while(true)循环。

2、该程序是为了更清楚的演示问题而建立,其中创建StringBuilder对象只是为了占用内存而已。

 

奇怪现象

1、如果使用定时器方式,则(以下数据,不同机器上稍不相同,同一机器上有时也不相同)

_objectSize = 100  时,Do方法被执行大约175次;

_objectSize = 1000 时,Do方法被执行大约33次;

_objectSize = 10000时,Do方法被执行大约4次。

2、如果不使用定时器,就不存在上述的问题,Do方法会一直被执行下去,没有次数的限制。

3、在Visual Studio 2003 Visual Studio 2005 环境下,都是一样。

 

问题

难道定时器受到内存的限制?

 

程序清单

 

//
//  Worker.cs
//
using  System;
using  System.Text;
using  System.Threading;
using  System.Collections;

namespace  WeirdTimer
{
    
public   class  Worker
    {
        
///   <summary>
        
///  创建的对象的计数。
        
///   </summary>
         int  _objectCount  =   0 ;

        
///   <summary>
        
///  Do 方法执行的次数。
        
///   </summary>
         int  _doCount  =   0 ;

        
///   <summary>
        
///  链表,用于保存创建对象的引用。
        
///   </summary>
        ArrayList _list  =   new  ArrayList();

        
///   <summary>
        
///  对象的所占内存空间的大小。(字符数)
        
///   </summary>
         int  _objectSize  =   10000 ;

        
///   <summary>
        
///  是否使用定时器。
        
///   </summary>
         public   static   bool  IsTimerUsed  =   true ;


        
///   <summary>
        
///  Do 方法。作为 Timer 的回调函数。
        
///   </summary>
         public   void  Do( object  obj)
        {
            
++ _doCount;
            Console.WriteLine(
" "   +  _doCount.ToString()  +   " 次执行 Do 方法。 " );

            
for ( int  i  =   0 ; i  <   3 ; i ++ )   //  每次执行 Do 创建 3 个 StringBuilder 对象。
            {
                StringBuilder sb 
=   new  StringBuilder(_objectSize);
                _list.Add(sb);

                
++ _objectCount;

                Console.WriteLine(
" 第  "   +  _objectCount.ToString()  +   "  个对象已创建。 " );
            }
        }

        
///   <summary>
        
///  启动 Do 操作。
        
///   </summary>
         public   void  Start()
        {
            
if (Worker.IsTimerUsed)  //  定时器方式
            {
                TimerCallback callback 
=   new  TimerCallback(Do);
                Timer timer 
=   new  Timer(callback,  null 0 500 );
            }
            
else   //  非定时器方式
            {
                
while ( true )
                {
                    Do(
null );
                }
            }
        }

        
public   static   void  Main()
        {
            Console.WriteLine(
" 按回车键退出程序... " );
            Worker aWorker 
=   new  Worker();
            aWorker.Start();
            Console.ReadLine();
        }
    }
}

 

在Linux下的Qt框架中,要实现精确到微秒级别的定时器,可以使用`QTimer`类的`singleShot`方法或者`QTimer`类的`timeout`信号与槽机制。但是,由于操作系统的调度策略和硬件限制,实际上可能无法保证完全精确到微秒级,尤其是在高负载或者其他中断密集型的系统中。通常情况下,`QTimer`的精度受操作系统的定时器精度限制,大多数操作系统提供的定时器精度在1毫秒到10毫秒之间。 如果需要更精确的定时器,可以使用`QElapsedTimer`类来测量时间间隔,或者使用`select`、`poll`、`epoll`等系统调用,这些调用可以在用户空间模拟精确的定时事件。对于嵌入式系统或者需要高精度定时器的应用,可以使用高分辨率计时器(High-Resolution Timers,HRTimers)。 在使用`QTimer`时,可以通过设置定时器的间隔(interval)为所需的时间(以毫秒为单位),然后通过信号槽机制来响应定时事件。如果需要微秒级别的精度,可以在槽函数中进一步处理。 以下是一个使用`QTimer`实现微秒级别定时器的示例代码: ```cpp #include <QTimer> #include <QDebug> void timerCallback(int count) { qDebug() << "Timer fired!" << count << "times"; } int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QTimer timer; // 设置定时器以每500微秒触发一次 timer.start(500, Qt::PreciseTimer); // 连接定时器的timeout信号到槽函数 QObject::connect(&timer, SIGNAL(timeout()), &app, SLOT(quit())); QObject::connect(&timer, SIGNAL(timeout()), &timer, SLOT(deleteLater())); // 防止内存泄漏 return app.exec(); } ``` 在上述示例中,`Qt::PreciseTimer`是用来告诉Qt尽可能地尝试使用高精度定时器,但实际精度还是受限于操作系统的定时器分辨率。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值