1

これが私のコードです

while (true)
{
    gg = this.CreateGraphics();
    b1 = new SolidBrush(Color.Red);
    b2 = new SolidBrush(Color.Blue);
    p1 = new Pen(Color.Red);

    neuron.transferFunction_output();
    for (int i = 0; i < 10; i++)
    {
        if (neuron.layer2[i] == 1)
        {
            gg.FillEllipse(b1, ox1 - 100 * i, oy2, (float)20, (float)20);
            for (int j = 0; j < 10; j++)
            {
                gg.DrawLine(p1, ox1 - 100 * i, oy2, ox1 - 100 * (float)j, oy3);
            }
        }
        else
        {
            gg.FillEllipse(b2, ox1 - 100 * i, oy2, (float)20, (float)20);
        }
    }
    for (int i = 0; i < 10; i++)
    {
        if (neuron.layer3[i] == 1)
        {
            gg.FillEllipse(b1, ox1 - 100 * i, oy3, (float)20, (float)20);
            for (int j = 0; j < 10; j++)
            {
                gg.DrawLine(p1, ox1 - 100 * i, oy3, ox1 - 100 * (float)j, oy4);
            }
        }
        else
        {
            gg.FillEllipse(b2, ox1 - 100 * i, oy3, (float)20, (float)20);
        }
    }
    for (int i = 0; i < 10; i++)
    {
        if (neuron.layer4[i] == 1)
        {
            gg.FillEllipse(b1, ox1 - 100 * i, oy4, (float)20, (float)20);
            for (int j = 0; j < 10; j++)
            {
                gg.DrawLine(p1, ox1 - 100 * i, oy4, ox1 - 100 * (float)j, oy5);
            }
        }
        else
        {
            gg.FillEllipse(b2, ox1 - 100 * i, oy4, (float)20, (float)20);
        }
    }
    for (int i = 0; i < 10; i++)
    {
        if (neuron.layer5[i] == 1)
        {
            gg.FillEllipse(b1, ox1 - 100 * i, oy5, (float)20, (float)20);
        }
        else
        {
            gg.FillEllipse(b2, ox1 - 100 * i, oy5, (float)20, (float)20);
        }
    }
    Thread.Sleep(1000);
    Application.DoEvents();
}//end while

ここで、ループの前半で作成した図面をワイプしたいと思います。つまり、最後の反復で描画された最後の図面を表示する必要はありません。私が使用する場合Graphics.clear(Color.SomeColor)、各反復後に背景色全体が変化しますが、それはしたくありません。次に、以前と同じトラックで同じ線を描くが白い色(消しゴムとして機能するメソッドを意味する)のメソッドを宣言すると、コードが長くなりすぎてThread.Sleep()、コードで使用する必要があるため、メモリと時間がかかりますいくつかの理由で。最後の図面を消去する他の方法はありますか?よろしくお願いします

4

1 に答える 1

4
while(true) {
    var g = someControl.CreateGraphics();
    draw(g);
}

この種の構成は、期待どおりに機能しません。DoEvents()これが、ループを呼び出す必要がある理由です。メッセージポンプをブロックしています。CreateGraphics()また、ハンドラーの外部で呼び出してペイントOnPaintするため、ウィンドウが更新を実行すると、描画したものはすべて消去されます。

すべての描画コードをOnPaintハンドラーに移動する必要があります。これにより、必要なたびに描画する新しいサーフェスが提供され(呼び出しInvalidate()て再ペイントを強制する)、Windowsメッセージポンプと一致するようになるため、(厄介な)への呼び出しを削除できますDoEvents()。この方法でもアニメーション化でき、コードはよりシンプルになります。

ループ内の論理的な相互作用を更新Invalidate()し、画面をペイントする準備ができたら呼び出すことができます。

私はいくつかの読書をお勧めします:Windowsメッセージループ。

于 2012-07-30T17:19:45.597 に答える