1

非常に多くのコントロールを含み、非常に多くのインタラクティブなアクションを実行するフォームがあります。これにより、使用中にフォームの遅延が発生します。これらのコントロールの 1 つは、サーバーから受信した大量のデータをプロットするプロット ツールです。描画ツールを別のフォームに移動してフォームを軽量化し、遅延の問題を軽減することを考えました。友人から、両方のフォームを処理する同じスレッドであるため、これはあまり役に立たないと言われましたが、本当ですか?

4

3 に答える 3

2

あなたの友人の言うことは真実ですが、ここでは当てはまらないでしょう。フォームに多くのコントロールがあると、フォームの動作が遅くなります。それ自体を再描画する必要がある場合、すべてのコントロールがそれ自体を描画するのにかかる時間に気づき始めます。通常、これはフォームに約 50 個のコントロールがある場合に発生しますが、コントロールの種類によって大きく異なります。たとえば、ボタンは非常に高価ですが、ラベルはそうではありません。あなたのプロットは高価である可能性が高いため、その後に描画されるもの (Z オーダーの上位) は遅延します。コントロールを右クリックし、[最前面へ移動] をクリックして、最後に描画されるようにします。

何をするにしても、プログラムを改善できるとは知らずに、考えているような大幅な変更を加えてはいけません。最初に測定が必要です。CPUサイクルがどこで消費されているかを知るには、プロファイラーが必要です。描画コードのプロファイリングは、頻繁に実行されるわけではないため、それほど簡単ではありません。これは修正できます。フォーム コンストラクターを次のように変更します。

    public Form1() {
        InitializeComponent();
        Application.Idle += new EventHandler((s, ea) => this.Invalidate());
    }

フォームは 100% コアを燃やし、何度も何度も再描画されます。しかし、それ以外はまだ完全に機能しています。ペイント コードを効果的にプロファイリングするために必要なものだけです。

于 2012-07-28T12:04:47.170 に答える
0

アプリケーションの起動時にフォーム(プロットツールコンテナ)を作成すると、起動速度が遅くなります...

次に、2つの方法があります:

1)プロッティング ツール コンテナを新しいフォームに移動しますが、必要に応じて作成します (アプリケーションの起動後)。

2)プロッティング ツールを新しいスレッドに移動します。この場合、別のフォームに移動して、新しいスレッドで作成できます。このように使えば初速が上がります

于 2012-07-28T11:04:07.093 に答える
0

ここで与えられた答えから始めて

私はちょうどコードを試してみて、それをより明確にするために少し修正しました:

static void Main()
{
    Thread t1 = new Thread(Main1);
    Thread t2 = new Thread(Main2);

    t1.Start();
    t2.Start();

    t1.Join();
    t2.Join();
}

static void Main1()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

static void Main2()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form2());
}

そのうちの 1 つで Thread.Sleep() を使用してみましたが、2 番目の形式の gui がロックしなかったため、機能していると言えます。

于 2012-07-28T11:29:51.507 に答える