-3

これで、WinForm 上のコントロールをアニメーション化してから、残りのコード ブロックの後続の操作を再開するプログラムができました。これがサンプルコードです。

関数はおそらくメインスレッドで実行されているWinFormにあります

 Private void DoThisWork();
    {

    do some work here

    animateControls()
    //<NEED TO PAUSE HERE WHILE THE GUI ANIMATES AND UPDATES DISPLAYING THE ANIMATION OF THE CONTROL>

    //Tried Option 1: thread.sleep. When we do this the main thread blocks and the animation is //not seen. The control is directly painted at x1,y1 and thats it, the intermediate rendering is not seen

    // Tried Option 2: Application.DoEvents. This works very well except that the CPU maxes out and the animation then appears very jittery

   continue doing remaining work  // must execute only after animateControls() completes the animation part.

}

さて、これanimateControls()は単にタイマー上の関数であり、コントロールをポイント (x,y) から (x1,y1) に移動します。これには約 3 秒かかります。

SuspendLayout と ResumeLayout は GUI の更新を強制しません。これは、thread.sleep によってメイン スレッドがブロックされ、すべてが事実上停止しているためです。

別のスレッドを使用して GUI をアニメーション化しても、アニメーション全体を完了する必要があるため、役に立たないようです。

また、アニメーションコードは複数の関数から呼び出され、共通関数として使用されるため、何も追加できません。

4

1 に答える 1

3

あなたは間違った道を進んでいます。別のスレッドで作業を行い、作業スレッドが終了するまでUIスレッドにアニメーションを実行させます。

BackgroundWorkerクラスが役立つ場合があります。http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

于 2012-11-30T08:24:36.037 に答える