我目前正在创建一个GUI应用程序框架,作为Ionite Framework的一部分。我将用于我的学校最终项目, 我的问题是:
我使用线程来维护动画,
ParameterizedThreadStart iv = new ParameterizedThreadStart(o => {
this.Size = (Size)o;
});
new Thread(()=>{
float stepWidth = (targetWidth-currentWidth)/transition;
float baseWidth = currentWidth;
int tick=transition;
while(tick-- > 0){
baseWidth+=stepWidth;
Invoke(iv,new Size(baseWidth,this.Height));
Thread.Sleep(1);
}
}).Start();
假设this运算符是Control对象。当我在我的控制对象上使用背景时,它比预期的更长。
我的代码/方法有什么问题? 感谢
答案 0 :(得分:2)
Thread.Sleep(1);
这不符合你的期望。 Sleep()方法只能睡眠等于或等于操作系统时钟滴答分辨率的整数倍的间隔。默认情况下,每秒刻录64次。或15.625毫秒。所以你的动画效果比你想象的慢16倍。
这在技术上是你可以通过pinvoking timeBeginPeriod(1)来解决的。但是你不应该这样做,16毫秒就足以使任何动画看起来都很平滑。只需将stepWidth变量放大16倍即可。假设您的UI线程可以跟上所需的绘画评级。
下一步是要认识到使用线程是无用的,它仍然只能像Invoke()一样快。这要求UI线程足够响应。因此,使用普通的同步Timer代替完全相同的结果,减去线程的开销。