0

我目前正在创建一个 GUI 应用程序框架作为 Ionite 框架的一部分。我将用于我的学校期末项目,我的问题是:

我使用线程来维护动画,

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 对象。当我在我的控制对象上使用背景时,它比预期的要长。

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

4

1 回答 1

2
Thread.Sleep(1);

这不会像你希望的那样做。Sleep() 方法只能休眠等于或整数倍的操作系统时钟刻度分辨率的时间间隔。默认情况下,每秒滴答 64 次。或 15.625 毫秒。所以你的动画实际上比你想象的慢 16 倍。

从技术上讲,您可以通过调用 timeBeginPeriod(1) 来解决此问题。但你不应该,16 毫秒足以让任何动画在人眼中看起来很流畅。只需将 stepWidth 变量增大 16 倍即可。假设否则您的 UI 线程可以跟上所需的绘画等级。

下一步是认识到使用线程是没有用的,它仍然只能尽可能快地运行 Invoke()。这需要 UI 线程足够响应。所以使用一个普通的同步定时器来代替完全相同的结果,减去线程的开销。

于 2013-05-12T17:35:32.073 回答