2017-03-11 12 views
-4

大きな戦いの後、私は "ゲームエンジン"を書いて、私は非常に奇妙なバグを発見しました。 フォームを移動するとOutOfMemoryの例外が発生します(アプリケーションは24 MBを必要としないから5秒以内に6 GB以上のRAMに移行します)が、それは最悪のことではありません。これはフォームを上に移動するときにのみ表示され、他の方向には何も起こりません。ここで私は、これがアップ特有のOutOfMemory例外

using System.Drawing; 
using System.Windows.Forms; 

namespace WindowsFormsApplication10 
{ 
public partial class Form1 : Form 
{ 
    Graphics h; 
    Bitmap bmp; 
    System.Threading.Thread WTF; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 


    private void LOL() 
    { 

     bmp = new Bitmap(500, 500); 
     Graphics WHAAAAT = Graphics.FromImage(bmp); 
     while (true) 
     { 

      WHAAAAT.FillEllipse(Brushes.Black, 50, 50, 50, 50); 
      h.DrawImage(bmp, 0, 0); 

     } 
    } 
    private void WOOT(Graphics g) 
    { 
     h = g; 
     WTF = new System.Threading.Thread(new System.Threading.ThreadStart(LOL)); 
     WTF.Start(); 
    } 

    private void panel1_Paint(object sender, PaintEventArgs e) 
    { 
     Graphics d = panel1.CreateGraphics(); 
     d.FillEllipse(Brushes.Black, 50, 50, 50, 50); 
     WOOT(d); 
    } 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     WTF.Abort(); 
    } 
} 

}

フォームの境界線スタイルがsingleFixedに設定されているフォームを移動した後すぐにクラッシュが自分のアプリケーションとして動作するsimilary書いたコードの一部です。なぜこのことが起こるのか? 私の場合には、それは巨大なRAMの使用によって引き起こされる他の例外がスローされますが、それはまた、あなたがこれはバグではありません

+0

プロファイルしましたか? – Carcigenicate

+0

という名前の変数を持つWTFは、鼻の悪魔のためのC#バックドアです。そのため、奇妙なことが起こっています:) –

答えて

5

を形成して移動する場合にのみ、それはあなたの過度のスレッド生成の結果である表示されます。

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    Graphics d = panel1.CreateGraphics(); 
    d.FillEllipse(Brushes.Black, 50, 50, 50, 50); 
    WOOT(d); 
} 

パネルが再描画されるたびに(通常はウィンドウ移動のために無効化されます)、新しいスレッドを作成します(途中でWOOT、クリエイティブ名を呼び出します)。しかし、このスレッドは永遠に実行されます(LOL、クリエイティブ名も)

フォームの移動を開始するとすぐに、そのパネルの一部が無効になります(たとえば、他のものや画面に覆われている場合など)再び表示されるとすぐにPaintイベントが発生します。

そして、あなたがそうで、それは永遠に実行してみましょう、新しいスレッドを作成して、フォームを移動し続け、新しいスレッドを作成し、...

だから、あなたが何をすべきか、メソッドを作成することです(提案:それをROFLYOLOまたはSWAGと呼ぶ)、スレッドを破棄して新しいスレッドを生成する。

+0

thatsはすべてを説明しています。また、フォームを上に移動するときにのみ、なぜそれを再描画しますか? – Vordex

+0

これは、常にパネルの一部が覆い隠されており、その部分が再びビューアにさらされたときに再度塗り直さなければなりません。 – Psi

関連する問題