【问题标题】:blinking labels backColor in C#在C#中闪烁标签backColor
【发布时间】:2016-05-27 02:57:30
【问题描述】:

我有这个包含 4 个标签的表格。我希望这些标签以指定的频率闪烁,例如 12.5、10、8 和 4 HZ。我用了一个定时器,但它不能正常工作,它们闪烁的频率要低得多,我知道这是因为在下面的freqMethod 中嵌套了ifs。我应该如何解决这个问题?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Timers;
using System.Threading;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        System.Timers.Timer mainTimer; 
        private int counter = 0;
        Color lColor = Color.FromArgb(255, 192, 128);
        bool buttonPressed = false;

        public Form1()
        {

            InitializeComponent();
            label1.BackColor = lColor;
            label2.BackColor = lColor;
            label3.BackColor = lColor;
            label4.BackColor = lColor;
            mainTimer = new System.Timers.Timer(1);
            mainTimer.Elapsed += new ElapsedEventHandler(timerElapsed);
        }


        private void button2_Click(object sender, EventArgs e)
        {   
            if (buttonPressed)
            {
                mainTimer.Enabled = false;
                buttonPressed = !buttonPressed;
                counter = 0;
            }
            else
            {

                mainTimer.Enabled = true;
                buttonPressed = !buttonPressed;
                counter = 0;
            }
        }

        //Frequency Method

        public void freqMethod()
        {
           if (counter % 80 == 0)
               if (label4.backColor == lColor)
                   label4.backColor = Color.black;
               else
                   label4.backColor = lColor;
           if (counter % 100 == 0)
               if (label3.backColor == lColor)
                   label3.backColor = Color.black;
               else
                   label3.backColor = lColor;
           if (counter % 125 == 0)
               if (label2.backColor == lColor)
                   label2.backColor = Color.black;
               else
                   label2.backColor = lColor;
           if (counter % 250 == 0)
               if (label1.backColor == lColor)
                   label1.backColor = Color.black;
               else
                   label1.backColor = lColor;



        }
        private void timerElapsed(object source, ElapsedEventArgs e) {
            counter++;
            freqMethod();
        }

    }
}

【问题讨论】:

    标签: c# label backcolor


    【解决方案1】:

    给定以下值(如果您想使用一个计时器同步它们),它们可以具有的常见间隔为 5 毫秒。因此,您需要将计时器每 5ms 打勾并检查频率。但请注意使用计时器,如下所述:

    12.5hz = 80ms
    10hz   = 100ms
    8hz    = 125ms
    4hz    = 250ms
    

    来自 MSDN 使用 System.Timers.Timer (https://msdn.microsoft.com/en-us/library/system.timers.timer.interval(v=vs.110).aspx) 的备注请参阅备注部分。

    您可以使用 Interval 属性来确定 Elapsed 事件被触发。因为 Timer 类依赖于系统 时钟,它具有与系统时钟相同的分辨率。这意味着 Elapsed 事件将以分辨率定义的间隔触发 如果 Interval 属性小于 系统时钟的分辨率。以下示例设置 间隔属性为 5 毫秒。在 Windows 7 系统上运行时 其系统时钟的分辨率约为 15 毫秒, 事件大约每 15 毫秒触发一次,而不是每 5 毫秒

    但如果您可以为每个计时器使用多个计时器,那么您可以按照 Yeldar 所述设置计时器的每个间隔。

    【讨论】:

      【解决方案2】:

      您不需要计时器每秒进行迭代,因为您跳过它是每个 n 迭代,而它们占用了太多资源。您可以使用TimerInterval 值进行操作,以获得所需的频率和足够的性能。

      例如,对于 8 Hz 的频率,您只需要每 125 毫秒(每秒 8 次)触发一个事件的计时器。
      我将提供一个频率为double 的示例,以使其适用于0.5,则颜色将每2 秒更改一次。

      例子:

      public Form1()
      {
          double frequencyInHz = 8.0; // here goes your frequency
          int interval = (int)Math.Round(1000.0 / frequencyInHz); // 125ms in this case
          mainTimer = new Timer(interval);
          mainTimer.Elapsed += new ElapsedEventHandler(timerElapsed);
      }   
      
      private void timerElapsed(object source, ElapsedEventArgs e) {
          if (label2.BackColor == lColor)
              label2.BackColor = Color.Black;
          else
              label2.BackColor = lColor;
      }
      

      如果您需要多个标签来改变它们的不同颜色,则需要制作多个计时器才能获得良好的性能。

      【讨论】:

      • 请注意,如果我没记错的话,该计时器的最小间隔是 15 毫秒。
      • 这样,我想我应该使用多个计时器,或者,有更好的方法吗?
      • @user4949420 是的。在我看来,这是最有效的方法。当然,如果你有适当数量的标签和计时器——比如 4 个或 5 个。
      【解决方案3】:

      试试这个(除了 Joel 或 Yeldar 提出的定时器间隔修改):

      if (counter % 80 == 0)
      {
        label4.backColor = label4.backColor == lColor ? Color.black : lColor;
        label4.Refresh() ;
      }
      

      【讨论】:

      • 我在其他地方看到过类似的东西,这条线到底是什么意思? label4.backColor = label4.backColor == lColor ? Color.black : lColor;
      • "x = BoolCondition ?a : b" 是一种简洁的编码方式 "if (BoolCondition) x=a ; else x=b;"
      猜你喜欢
      • 1970-01-01
      • 2011-04-18
      • 2014-02-20
      • 2013-07-08
      • 1970-01-01
      • 2013-02-12
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多