【问题标题】:Increment / Decrement Time递增/递减时间
【发布时间】:2018-04-08 18:14:54
【问题描述】:

问候我在尝试制作简单的事件调度程序时遇到了一些问题。 在下面的代码中,我的意图是增加或减少时间(当使用鼠标事件按下按钮时)。

但是经过多次尝试,我无法弄清楚为什么我可以增加;但不是减少时间。

    // Timer
    private Timer TmrCount;

    private int HH {get;set;}
    private int MM { get; set; }

    private Button CurrBtn = new Button();

    #region <Mouse Events>
    private void OnMouseDown(object sender, EventArgs e)
    {
        CurrBtn = (Button)sender;

        StartTimer();
    }

    private void OnMouseUp(object sender, MouseEventArgs e)
    {
        StopTimer();
    }
    #endregion

    #region <Timer>
    private void StartTimer()
    {
        if (TmrCount == null)
        {
            TmrCount = new Timer();
            TmrCount.Interval = 210;
            TmrCount.Tick += TmrCount_Tick;
            TmrCount.Start();
        }
    }

    private void TmrCount_Tick(object sender, EventArgs e)
    {
        Set_Time();
    }

    private void StopTimer()
    {
        if (TmrCount != null)
        {
            TmrCount.Stop();
            TmrCount.Dispose();
            TmrCount.Tick -= TmrCount_Tick;
            TmrCount = null;
        }
    }

    private void Set_Time()
    {
        switch (CurrBtn.Text)
        {
            case "+":
                // Condition Check (Increase HH))
                //if (HH == 23) { HH = default(int); }

                //Increase HH
                //if (HH < 23) { HH += 1; }

                while (HH < 23) { HH++; break; }
                break;

            case "-":
                // Condition Check (Decrease HH)
                //if (HH == default(int)) { HH = 23; }
                //if (HH == 0) { HH = 23; }

                // Decrease HH
                while (HH > 23) { HH-=1; break; }
                break;
        }

        // Set Hour Text into Label
        lbl_HH.Text = Convert.ToString(HH);
    }
    #endregion

谁能指出我正确的方向? 提前致谢

【问题讨论】:

  • 您认为您的 HH 变量会达到 > 23 的值吗?
  • 问候史蒂夫。它确实达到了 23。我可以增加但减少功能根本不起作用..
  • 而您降低 HH 的测试预计它的值大于 23。

标签: c# datetime timer increment decrement


【解决方案1】:

假设您的 HH 变量以 1 开头,那么您应该以这种方式更改您的 SetTime

int HH = 1;

private void Set_Time()
{
    switch (CurrBtn.Text)
    {
        case "+":
            // Condition Check (Increase HH))
            // Within a limit of 23
            while (HH < 23) { HH++; break; }
            break;

        case "-":
            // Condition Check (Decrease HH)
            // Decrease HH but don't allow it to be less than 0 
            while (HH >= 0) { HH-=1; break; }
            break;
    }

    // Set Hour Text into Label
    lbl_HH.Text = Convert.ToString(HH);
}

顺便说一句,在你释放一个对象之后,你永远不应该尝试访问它,即使是删除一个事件处理程序。

private void StopTimer()
{
    if (TmrCount != null)
    {
        TmrCount.Stop();
        TmrCount.Tick -= TmrCount_Tick;
        TmrCount.Dispose();
        TmrCount = null;
    }
}

【讨论】:

  • 您正在重用变量 TmrCount 并且每次调用 StartTime 时都会为它分配一个新的引用(Timer 对象的)。因此,这里的不同之处在于您对 null 的测试。对一次性对象调用 Dispose 是一种很好的做法,但在这种简单的上下文中,GC 仍然能够释放该内存。
  • @RicardoGarcia “Dispose 意味着您将对象标记为由 GC 从内存中删除”史蒂夫的评论可以说是不完整的(我假设史蒂夫试图在一句话中包含体面的解释导致这一点) .没有办法“为 GC 标记对象”,Dispose 与 GC 无关,实际上主要是由于 GC 根本没有涵盖的实体(例如非托管内存分配)而需要...您可能想阅读真正的解释- stackoverflow.com/questions/2344240/… 并搜索 bing.com/search?q=c%23+dispose+gc
  • @AlexeiLevenkov 此评论直接具有误导性,而不是“尝试打包一个体面的解释”,尤其是关于“如果 GC 出于任何原因做出他们需要的决定,您不应该冒险发生严重崩溃的风险”立即记忆。“。
  • 好吧,cmets 离主题有点远(他们应该这样做;但它违反了 stackoverflow 规则)。因此为了让用户遵循 Dispose 的路径:stackoverflow.com/questions/2926869/…
猜你喜欢
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
  • 2012-01-29
  • 2016-07-05
  • 2012-04-29
相关资源
最近更新 更多