0

現在、Ionite Framework の一部として GUI アプリケーション フレームワークを作成しています。学校の最終プロジェクトに使用するもの、私の質問は次のとおりです。

アニメーションを維持するためにスレッドを使用していますが、

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() メソッドは、オペレーティング システムのクロック ティック分解能と等しいか整数倍の間隔でのみスリープできます。デフォルトでは、これは 1 秒あたり 64 回ティックします。または 15.625 ミリ秒。したがって、実際のアニメーションは、思ったよりも 16 倍遅くなります。

これは技術的には、timeBeginPeriod(1) をピンボークすることで修正できます。人間の目にはどんなアニメーションでも滑らかに見えるようにするには、16 ミリ秒で十分です。stepWidth 変数を 16 倍大きくするだけです。それ以外の場合は、UI スレッドが必要なペイント レーティングに対応できると仮定します。

次のステップは、スレッドを使用することは役に立たないことを認識することです。それでも、Invoke() ができる限り高速にしか実行できません。これには、UI スレッドが十分に応答する必要があります。そのため、まったく同じ結果を得るには、代わりに単純な同期タイマーを使用して、スレッドのオーバーヘッドを差し引いてください。

于 2013-05-12T17:35:32.073 に答える