C# PictureBox 刷新问题[急]

来源:百度知道 编辑:UC知道 时间:2024/07/08 01:11:08
首先:每次刷新图片的时候都要对一个图片进行一些运算,这大概需要零点几秒的时间.
然后:我想要在鼠标移动的事件里对PictureBox进行刷新.

现在的问题是:在鼠标移动的过程中图片刷新得非常慢,远远比对图片进行运算时的时间长.基本上如果鼠标不停止移动的话,图片就不会刷新,但是鼠标一停图片就立刻刷新了.

非常不理解这个状况是怎么回事.希望高人解释.
代码大概是这样的:
override Refresh()
{ this.Image = anotherPicture();
Thread.Sleep(400);
base.Refresh();
}

OnMouseMove( sender, e )
{ Refresh();
}
在我的代码里用的不是Thread.Sleep.我在这儿写这个函数是为了说明前面那个anotherPicture()函数要用的时间可能很长.

是不是每次这个事件被触发的时候,这个函数都是在同一个线程里被调用的?所以会出现上一个函数还没有运行完毕下一次事件触发不会有动作?可是就算这样,在第一个0.4秒过去之后图片也应该刷新一下啊.

实际情况是,我不停的移动鼠标移动了很久,但是只有在停止移动的瞬间图片才会刷新上去.得到的是所有anotherPicture()最终的结果.

0.4S的计算时间已经很长了,你要知道鼠标移动事件触发是非常频繁的,可能你看到的只有一小段距离但是触发已经超过几十次了(每个像素至少一次),就算是每个像素1次吧,移动10个像素时Thread.Sleep已经占掉了4秒钟的时间了,而你要知道这鼠标移动的仅是10个像素,大多数显示器上这是2-3毫米的长度你可以衡量一下你鼠标移动的时间和Thread被你暂停的时间。乐观估计一下你移动鼠标只有零点几秒但线程却被你暂停了4秒,你想想它有足够的时间来为你刷新图像吗?
-------------------补充---------------------
你的猜测是正确的。事件是放在主线程里面执行的,和绘制界面是同一个线程,所以它忙的时候,界面是不可能重画的。
解决方案是:多线程。不过照你的需要来看,基本上要实时重绘是不可能的~

你这样当然不行啊!你的Thread.Sleep(400); 是在主线程里,到这里整个主线程都挂起来了!解决方法是使用多线程。当鼠标移动时,新建一个线程用于刷新图片,这样就不会停顿了哦。
override Refresh()
{
Thread rf= new Thread(RefreshImage);
rf.Start();
}

void RefreshImage()
{
//刷新图片代码

}

不明白你要实现个什么功能,你的设计有问题,

标记下!