2012-03-26 13 views
1

私は、ワードドキュメント内のすべてのテーブルをループし、すべてのセルの幅の値を読み取るコードを持っています。何らかの理由で、ウィンドウが最小化されたときにこのコードが約5〜10倍高速に実行されることに気付きました。アイデアを得るには、with the window maximized, it takes ~0.02 seconds to make the Cell.Width callを実行すると、with the window minimized, it takes .001 to .0015 seconds per callが実行されます。Wordウィンドウを最小化するとCOMの速度が向上しますか?

これを引き起こしている可能性があることは誰でも知っていますし、ウィンドウを最小化せずにこれらの結果を再現できるかどうかは誰でも知っています。ユーザーとしては、ウィンドウをランダムに最小化/最大化して操作を行うことは非常に奇妙です。

//doc and app are the active Document and Application respectively. 
    try 
    { 
     app.ScreenUpdating = false; 
     //app.WindowState = word.WdWindowState.wdWindowStateMinimize; //enabling this improves speeds by 5x to 10x 
     foreach (word.Table table in doc.Tables) 
     { 
      //loop over every cell in a table and read/store its cell.Width value. 
     } 
    } 
    finally 
    { 
     //you can alternatively store the original values here and restore them to that. For simplicity, I did not do that here. 
     app.ScreenUpdating = true; 
     app.WindowState = word.WdWindowState.wdWindowStateMaximize; 
    } 
+0

これはExcelでこの動作に気付きましたが、これは確定的な回答ではありませんが、UIが表示されているときにのみ実行するコードが必要であると想定しました。たとえば、ダブルバッファリング。 私の推測では、Microsoftがパフォーマンスを向上させるためにこの方法でコード化したということでした。 SItは、重要でないときにUIサイクルをスキップするという論理的な意味を持ちます。 しかし、Office開発チームの誰かがこれを見て回答を投稿しない限り、私はこれについて明確な答えがないと確信しています。 – David

+0

私はいつもWordでこれを気付いています。 MergeFieldを更新している間は、目的に合わせてアプリケーションを最小限に保ちます。開いたままにしておくと、すべての更新がドキュメントを移動してテキストの変更箇所を表示します。もちろん、これはプロセスを遅くします。 – Steve

+0

私はscreenUpdating = falseを設定すると、UIで発生する必要があるバッファリングが処理されると思っていました。私たちに何も支配していないことが起こっていると思いますか?また、 "読み取り"操作がこの効果を引き起こすことは珍しいようです。私はそれが書き込み操作だったらもっと理解できました。 – Shark

答えて

0

コントロールの多くは、このように振る舞う:リストが表示されていない場合でも、簡単なリストボックスに項目を追加すると速くなり、これはコントロールが表示されていないとき、いくつかのために、それはすべてのメッセージの処理を停止しますdefinetlyでありますUI関連(リフレッシュ、入力イベントなど)です。

ウィンドウを最小化するとパフォーマンスが大幅に向上する(十分なCOM呼び出しを行っている)場合は、ウィンドウを最小化してイメージスナップショットに置き換えることをお勧めします。最小化された。スピナーやプログレスバーをオーバーレイして、何かが起こっていることをユーザーに知らせることもできます。

関連する問題