如果我逐个点击,请单击箭头键然后单击并再次离开,等等图像变好。 但是,如果我不断按下右箭头键,只有当我离开右箭头键时,图像才会改变,因此加载此trackBar值的图像。
这是我的滚动事件:
private void trackBar1_Scroll(object sender, EventArgs e)
{
currentFrameIndex = trackBar1.Value;
textBox1.Text = "Frame Number : " + trackBar1.Value;
wireObject1.woc.Set(wireObjectAnimation1.GetFrame(currentFrameIndex));
LoadPictureAt(trackBar1.Value, sender);
button1.Enabled = false;
button2.Enabled = false;
button3.Enabled = false;
button4.Enabled = false;
button8.Enabled = false;
SaveFormPicutreBoxToBitMapIncludingDrawings();
return;
}
到目前为止,我没有其他trackBar事件。
这是LoadPictureAt函数:
private bool LoadPictureAt(int nIndex, object c)
{
bool bRet = false;
if (nIndex >= 0 && nIndex < fi.Length)
{
if (c.Equals(trackBar1))
pictureBox1.Load(fi[nIndex].FullName);
bRet = true;
}
return bRet;
}
我解决了这个问题:
我在滚动事件之前添加了一个新函数:
private void setpicture(int indx)
{
if (fi == null)
{
}
else
{
if (indx >= 0 && indx <= trackBar1.Maximum && fi.Length > indx)
{
try
{
label19.ForeColor = Color.Red;
fileToolStripMenuItem.Enabled = true;
label19.Visible = false;
label20.Visible = false;
label14.Visible = true;
label15.Visible = true;
label8.Visible = true;
label9.Visible = true;
trackBar1.Enabled = true;
using (FileStream fs = new FileStream(fi[indx].FullName, FileMode.Open))
{
this.label8.Visible = true;
this.label9.Visible = true;
this.label9.Text = fi[indx].Name;
Image img = null;
Bitmap bmp = null;
Image imgOLd = null;
try
{
img = Image.FromStream(fs);
bmp = new Bitmap(img);
imgOLd = this.pictureBox1.Image;
this.pictureBox1.Image = bmp;
if (imgOLd != null)
imgOLd.Dispose();
img.Dispose();
img = null;
}
catch
{
if (img != null)
img.Dispose();
if (bmp != null)
bmp.Dispose();
if (imgOLd != null)
imgOLd.Dispose();
}
}
}
catch
{
}
}
else
{
Image imgOLd = this.pictureBox1.Image;
if (imgOLd != null)
{
imgOLd.Dispose();
imgOLd = null;
}
Application.DoEvents();
}
}
}
并将滚动事件更改为:
private void trackBar1_Scroll(object sender, EventArgs e)
{
currentFrameIndex = trackBar1.Value;
textBox1.Text = "Frame Number : " + trackBar1.Value;
wireObject1.woc.Set(wireObjectAnimation1.GetFrame(currentFrameIndex));
trackBar1.Minimum = 0;
trackBar1.Maximum = fi.Length - 1;
setpicture(trackBar1.Value);
pictureBox1.Refresh();
button1.Enabled = false;
button2.Enabled = false;
button3.Enabled = false;
button4.Enabled = false;
button8.Enabled = false;
SaveFormPicutreBoxToBitMapIncludingDrawings();
return;
}
答案 0 :(得分:0)
当您按住光标键或尽可能快地反复猛击它时,没有“不停”这样的事情。它的KeyDown事件以现代cpus的冰川速度生成。你不能做得比每秒大约20次点击要好,每次点击之间50毫秒。现代核心可以轻松地在击键之间执行一亿条指令。
然而,重要的是你用这个巨大的资源做了什么。不幸的是,你没有做太多,你在Scroll事件中击中了这个磁盘。你调用Image.Load(),看起来像Image.Save()。这些方法只能在磁盘旋转时执行,cpu在等待磁盘完成工作时没有做任何有用的事情。浪费了数亿个cpu周期,等待机械事件发生。
实际上它从那里变得更糟。接下来发生的事情是Winforms需要使用从磁盘检索到的图像绘制窗口。绘画是一种低优先级的操作,只有在没有什么比这更重要的事情需要做的时候才能完成。
问题是,是需要做的更重要的事情。等待磁盘检索/保存图像需要很长时间,以至于Winforms消息循环遇到的下一件事是 more 比绘画更重要。输入事件,下一次击键。
如果正确执行,您的图片框实际上会分配其图像。你只是看不到它,因为它没有画到屏幕上。停止点击光标键和 bam ,它现在有时间和颜色。
这完全是设计上的。您可以通过调用图片框'Update()方法强制重绘,用户现在肯定会看到图像。但这实际上也不是很好,你的程序开始滞后。键盘被缓冲在消息队列中,并且您的程序将在您释放密钥后很长时间内更新图像。
选择你的毒药。