在我的numericUpDown Changed事件我调用一个函数(),当我改变数值时,程序正在运行它越来越慢

本文关键字:越来越 改变 程序 运行 函数 Changed numericUpDown 我的 事件 调用 一个 | 更新日期: 2023-09-27 18:15:31

这是带有timer2的数字更改事件代码,它没有解决正在调用的函数DoThresholdCheck()的问题

问题是,在这个函数中,每次我改变数值时,我都会创建一个临时列表,每次我移动数值时,都会改变列表是从一开始创建的。问题是,如果我在我的程序中使用一个大文件,列表有时包含16500个索引,并且需要时间来循环列表,所以我猜当我改变数值时,它需要时间来循环列表。如果我使用较小的视频文件,例如包含4000个索引的列表,所以没有问题。我试着使用Timer2,也许我可以在每次数值改变之间等待0.5秒,但仍然不能很好地工作。

当我改变数值,而程序是在一个大的视频文件上运行,它采取的值被改变像1-2秒!那可是很长的时间。

有办法解决吗?也许以某种方式在列表上更快地读取列表循环,即使列表很大?

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            Options_DB.Set_numericUpDownValue(numericUpDown1.Value);
            if (isNumericChanged == true)
            {
                isNumericChanged = false;
                myTrackPanelss1.trackBar1.Scroll -= new EventHandler(trackBar1_Scroll);
                DoThresholdCheck();
                counter = 0;
            }
        }
        private void timer2_Tick(object sender, EventArgs e)
        {
            counter++;
            if (counter > 1)
            {
                isNumericChanged = true;
                //timer2.Stop();
            }
        }

DoThresholdChecks()函数代码:

private void DoThresholdCheck()
        {
            List<string> fts;
            //const string D6 = "000{0}.bmp";
            if (Directory.Exists(subDirectoryName))
            {

                if (!File.Exists(subDirectoryName + "''" + averagesListTextFile + ".txt"))
                {
                    return;
                }
                else
                {

                    bool trackbarTrueFalse = false ;
                        fts = new List<string>();
                        int counter = 0;
                        double thershold = (double)numericUpDown1.Value;
                        double max_min_threshold = (thershold / 100) * (max - min) + min;
                        //label13.Text = max_min_threshold.ToString();
                        _fi = new DirectoryInfo(subDirectoryName).GetFiles("*.bmp");

                        for (int i = 0; i < myNumbers.Count; i++)
                        {
                            if (myNumbers[i] >= max_min_threshold)
                            {
                                //f.Add(i);
                                string t = i.ToString("D6") + ".bmp";
                                if (File.Exists(subDirectoryName + "''" + t))
                                {
                                    counter++;
                                    button1.Enabled = false;
                                    myTrackPanelss1.trackBar1.Enabled = true;
                                    trackbarTrueFalse = true;
                                    label9.Visible = true;
                                   // myTrackPanelss1.trackBar1.Scroll += new EventHandler(trackBar1_Scroll);
                                    //myTrackPanelss1.trackBar1.Minimum = 0;
                                   // myTrackPanelss1.trackBar1.Maximum = f.Count;
                                   // myTrackPanelss1.trackBar1.Value = f.Count;
                                   // myFiles = new Bitmap(myTrackPanelss1.trackBar1.Value);

                                }
                                else
                                {
                                    label9.Visible = false;
                                    trackbarTrueFalse = false;
                                    button1.Enabled = true;
                                    myTrackPanelss1.trackBar1.Enabled = false;
                                    myTrackPanelss1.trackBar1.Value = 0;
                                    pictureBox1.Image = Properties.Resources.Weather_Michmoret;
                                    label5.Visible = true;
                                    secondPass = true;
                                    break;
                                }
                                //fts.Add(string.Format(D6, myNumbers[i]));
                            }
                        }
                        //myTrackPanelss1.trackBar1.Maximum = _fi.Length - 1;
                        if (myTrackPanelss1.trackBar1.Maximum > 0)
                        {
                            if (trackbarTrueFalse == false)
                            {
                                myTrackPanelss1.trackBar1.Value = 0;
                            }
                            else
                            {
                                myTrackPanelss1.trackBar1.Maximum = counter;
                                myTrackPanelss1.trackBar1.Value = 0;
                                SetPicture(0);
                                myTrackPanelss1.trackBar1.Scroll += new EventHandler(trackBar1_Scroll);
                            }
                            //checkBox2.Enabled = true;
                        }
                        if (_fi.Length >= 0)
                        {
                            label15.Text = _fi.Length.ToString();
                            label15.Visible = true;
                        }
}
            }
            else
            {
                button1.Enabled = true;
            }
}

在我的numericUpDown Changed事件我调用一个函数(),当我改变数值时,程序正在运行它越来越慢

尝试缓存DoThresholdCheck方法的结果

如果确实需要处理,您不可能神奇地绕过处理所花费的时间。你有几个途径可以探索:

1)最小化正在进行的加工-所有这些都是必要的吗?您是否可以缓存其中的任何一个,并且在每次值更改时只重新计算一小部分?

2)减少处理次数——是否每次都需要重新计算?

3)在另一个线程上进行处理-这样至少你的UI保持响应,并且你可以在后台任务完成时将结果传递给UI线程。然而,这将是该模式的一个相对复杂的变体,因为如果在处理前一个值时值再次更改,则需要能够中止并重新启动。