2013-05-12 56 views
0

我目前正在创建一个GUI应用程序框架作为Ionite框架的一部分。我将用我的学校最后的项目, 我的问题是:使用C#:为什么我的动画线程运行得如此缓慢

林线程维护动画,

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(); 

假设这个操作符是一个控制对象。当我在我的控制对象上使用背景时,它比预期的更长。

我的代码/方法有什么问题? 谢谢

+2

你不能那样做。在UI线程上使用计时器。 – SLaks 2013-05-12 16:38:06

+0

我在上面的问题上编辑了我的代码,因此可以安全地进行跨线程操作(我认为) – 2013-05-12 16:41:26

+1

不。从不同的线程处理UI控件永远不安全。 – SLaks 2013-05-12 16:42:58

回答

2
Thread.Sleep(1); 

这不会做你希望它做的。 Sleep()方法只能在与操作系统时钟分辨率相等或整数倍的时间间隔内休眠。默认情况下,每秒打64次。或15.625毫秒。所以你的动画效果比你想象的要慢16倍。

这在技术上可以通过禁止timeBeginPeriod(1)来解决。但是你不应该这样做,16毫秒足以使任何动画看起来顺滑到人眼。只需将stepWidth变量变大16倍即可。假设否则你的UI线程可以跟上所需的绘画评分。

下一步是认识到使用线程是无用的,它仍然只能像Invoke()一样快。这需要UI线程足够响应。因此,使用普通的同步Timer来代替完全相同的结果,减去线程的开销。

+0

有没有办法获得操作系统支持的延迟或最小滴答? Timer和Thread有什么区别? Isnt计时器也是一个线程? – 2013-05-12 17:39:40

+0

如果你理解我发布的答案,那么你不应该对这些后续问题的答案感兴趣。如果需要,可以再次点击Ask Question按钮询问他们。 – 2013-05-12 17:45:04

相关问题