1

如果我一键单击离开箭头键,然后单击并再次离开,等等图像都变好了。但是,如果我不停地按右箭头键,则只有当我将右箭头键留在它停止的位置时,图像才会改变,以便加载此 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;









        }
4

1 回答 1

0

当您按住光标键或尽可能快地反复敲击它时,没有“不间断”之类的东西。它的 KeyDown 事件以现代 CPU 的缓慢速度生成。每秒 20 次点击,每次点击之间间隔 50 毫秒,没有什么比这更好的了。现代内核可以在两次击键之间轻松执行一亿条指令。

然而,重要的是你如何利用这些巨大的资源。不幸的是,你没有做太多,你在 Scroll 事件中碰到了这个磁盘。你调用 Image.Load(),看起来像 Image.Save()。这些方法只能在磁盘旋转时执行,cpu 在等待磁盘完成工作时没有做任何有用的事情。等待机械事件发生的一亿个 cpu 周期被浪费了。

它实际上从那里变得更糟。接下来发生的事情是 Winforms 需要使用从磁盘检索到的图像来绘制窗口。绘画是一个低优先级的操作,只有在没有更重要的事情需要做的时候才会做。

问题是,还有重要的事情需要做。等待磁盘检索/保存图像花费了很长时间,以至于 Winforms 消息循环遇到的下一件事情比绘画更重要。一个输入事件,下一次击键。

正确执行后,您的图片框实际上已分配了其图像。你只是看不到它,因为它没有被绘制到屏幕上。停止按光标键和bam,它现在有时间和油漆。

这完全是设计使然。您可以通过调用图片框的 Update() 方法强制重新绘制,用户现在肯定会看到图像。但这实际上也不是很好,您的程序开始滞后。击键被缓冲在消息队列中,您的程序将在您释放键后很长时间内继续更新图像。

选择你的毒药。

于 2012-07-22T21:44:40.307 回答