在我的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;
}
}
尝试缓存DoThresholdCheck方法的结果
如果确实需要处理,您不可能神奇地绕过处理所花费的时间。你有几个途径可以探索:
1)最小化正在进行的加工-所有这些都是必要的吗?您是否可以缓存其中的任何一个,并且在每次值更改时只重新计算一小部分?
2)减少处理次数——是否每次都需要重新计算?
3)在另一个线程上进行处理-这样至少你的UI保持响应,并且你可以在后台任务完成时将结果传递给UI线程。然而,这将是该模式的一个相对复杂的变体,因为如果在处理前一个值时值再次更改,则需要能够中止并重新启动。