大家好,请各位高手帮帮我,我学习一个计数器的例程,它通过time控件每500毫秒获取了一个计数器的值,获取在程序里显示的值是从0开始至50000结束,后又0~50000这样循环。请看例程的代码:private void m_CntTimer_Tick(object sender, EventArgs e)
        {
            if (AdvCounterLib.MeasurementType.EventCounting == m_axAdvCounter.MeasurementType)
            {
                //1. Get the data
                object varData = null;
                System.UInt32 nData = 0;
                bool bOverflow = false;
                if (!m_axAdvCounter.ReadMeasurementValue(out varData, out bOverflow))
                {
                    UpdateErrMsg();
                    return;
                }
                nData = (System.UInt32)varData;                //2. Show the data out
                txtResult.Text = nData.ToString();  //这个nData(一直都是0至50000不停循环)
            }
        }
我想实现每当值为30000时,nData值初始为0,且i计数一次,这样重复
用 int i 使用 i++ 计数一次,我写了大意如下的代码在如上的timer里,但是在timer里每次i都是不停的计数,
   int i = 0;
            if (nData == 30000)
            {
                i++; //每次到30000时候计数一次
                textBox1.Text = i.ToString();
                textBox1.Refresh();
            }
苦恼我好久了。哪位大哥大姐给个思路或者代码最好了,如果表达不清楚,请告诉我,谢谢了!

解决方案 »

  1.   

    Console.WriteLine("{0} {1}", nData, i);把这句放到Timer的最后一句,运行一段时间后把结果复制过来看看。
      

  2.   

    试试这样,代码不完整,无法测试int i = 0;
    private void m_CntTimer_Tick(object sender, EventArgs e)
    {
        if (AdvCounterLib.MeasurementType.EventCounting == m_axAdvCounter.MeasurementType)
        {
            //1. Get the data
            object varData = null;
            System.UInt32 nData = 0;
            bool bOverflow = false;
            if (!m_axAdvCounter.ReadMeasurementValue(out varData, out bOverflow))
            {
                UpdateErrMsg();
                return;
            }
            nData = (System.UInt32)varData;        //2. Show the data out
            txtResult.Text = nData.ToString();  //这个nData(一直都是0至50000不停循环)
        }
        if (nData == 30000)
        {
            i++; //每次到30000时候计数一次
            textBox1.Text = i.ToString();
            textBox1.Refresh();
        }
    }
      

  3.   

    是没太明白你的表达,不太清楚什么意思?
    你是想说i不应该不停的计数吗?   你每次把nData初始回去了,是不是原因?
      

  4.   

    To tuoshi,谢谢回复,我没有明白你的意思。To lzsh0622,谢谢回复,可能我没有表达好,你写的代码这样i会每500毫秒频率一直累加的(我设置的timer为500毫秒)。To FoxDave,谢谢回复,不好意思,我这样说看是否能表达的清楚:(请注意默认nData的值是一只在以0~50000不停的循环),在timer的频率为500毫秒,我想在第一次nData到达30000时候,i需要为1,同时初始化nData=0后又重新计数;在第二次nData到达30000时候,i需要为2,同时初始化nData=0后又重新计数;在第三次nData到达30000时候,i需要为3,同时初始化nData=0后又重新计数;……一次类推。谢谢
      

  5.   

    这是一个老外才告诉我的,但是小弟不才仍然在朦胧状态:It requires a bit of logic.  Keep a total accumulated counter and a value containing the last value seen from from the hardware counter.  Whenever you retrieve the hardware counter subtract it from the last value seen and add that to the total counter.  Remember to check to see if the hardware counter is less than the last value seen (which will happen when the hardware counter rolls over)  and add the remaining 16bit value to the total value.希望路过的朋友们能帮助一下,再次感谢大家!!
      

  6.   

    m_axAdvCounter.ReadMeasurementValue这个方法的代码呢?
    你的nData从这里面算出来的。是否算出来的值每次都是30000?
      

  7.   


    if (nData == 30000)
        {
            i++; //每次到30000时候计数一次
            textBox1.Text = i.ToString();
            textBox1.Refresh();
            nData=0;
        }加句nData=0;
      

  8.   

    你的意思应该是检查nData的值,每当它到3000的时候,计数+1 ,是不是?
      

  9.   


     int i = 0;
                if (nData == 30000)
                {
                    i++; //每次到30000时候计数一次
                    textBox1.Text = i.ToString();
                    textBox1.Refresh();
                }中的 int i = 0;
    在窗体类里面定义,不要在timer的函数里面的定义.
      

  10.   

    谢谢各位朋友的热情相助,与大家讨论给了我很多思路,再次谢谢!
    问题解决了。需要nData = 0,忘记初始为0了,汗~,OK,结贴散分。
      

  11.   

    To ncjcz,这个方法是组件自带的。
    To libinguest,对的,加nData=0。
    To hopewoo,对的,int i = 0;应该在timer外面。
    谢谢大家!