我现在需要在程序里对许多数据进行大量、连续的计算,打算用timer控件,时间设定为500毫秒,也就是每秒计算两次。而每次计算需要把约2000个数据累加求平均值。我想请教一下,以目前主流电脑的计算速度,能应付这么大、这么快的计算量嘛?现在的实际情况,需要累计的这些数据,都是10000以内的整数,比如3000,3100,等等,并且求出的平均值也是采用了取整,可是现在得出的结果很不正常,居然有负数,而我的数据源里的数据全部是正值,没有负的。程序段看下来也好像没什么错误,不知道是不是由于计算量太大,半秒的时间来不及计算而导致错误的结果。请高手指点, 谢谢

解决方案 »

  1.   

    能不能应付,你自己需要测试一下,这个很难说,影响因素比较多,为什么要用timer,可以考虑用线程
      

  2.   

    to mdejtod :计算过程中没有进行任何操作to bdmh老师:timer使用简单一点,线程方面的知识,还不是很熟悉
      

  3.   

    好长时间没有看见你了,呵呵如果是纯粹的加法和一次除法,按理说时间是足够了
    出现负数会不会是你定义的是整型变量范围小了,比如smallint,超过32000多,就变负数了
      

  4.   

    具体的速度测试,我没做过,但是现在有这么个情况:总数据量非常庞大,我现在是按照每次timer跳动,然后依次顺序选择其中的约2000个数据进行一次计算,这就出现了我说的这个错误。但是如果不采用timer控件,对所有数据一次性的进行总运算,在花费约15秒时间后就全部计算结束了,而且计算结果是准确的,没有错误。所以我怀疑是不是500毫秒的时间太短了,根本不够计算的
      

  5.   

    其实线程用delphi封装的tthread很简单的
      

  6.   


    呵呵,最近特别忙,估计春节前都不会有休息的时间,所以来的少了。
    计算过程就是你说的纯粹的加法,然后一次除法。另外,定义的整型变量是用的integer,会不会是2000个integer相加会超出范围?我感觉应该不会吧
      

  7.   

    很可能是由于数据类型溢出而导致的负数!
    1.可能累加数据溢出
    2.Timer中如果有Application.ProcessMessage,则可能由于过程重入导致计算混乱,产生溢出
      

  8.   

    就是类似以下的代码:
        a:=0;  b:=0;
        for k:=1000 downto 1 do
        begin
          a:=a+round(strtofloat(sl[k]));
          b:=b+round(strtofloat(sl[k]));
        end;
        c:=round(a/1000);
        d:=round(b/1000);其中sl是一个stringlist,没有其他任何语句了,不知道是否会引起溢出
      

  9.   

    问题自己解决了,不在timer控件之内,是外部一个数值搞错了。虽然500毫秒的时间很短,但是这么大的计算量依然能够顺利进行,现在的电脑运算速度真不是吹的。也谢谢各位朋友的指点,结贴了