2017-03-11 56 views
-4

经过大难题我写了“游戏引擎”,我发现了很奇怪的错误。 当你移动你的表单时出现OutOfMemory异常(应用程序从少于5秒的24MB到超过6GB的内存),但这不是最难的事情。这只会在你移动表单时出现,在任何其他方向上都不会发生。这里是一段代码,我写的作品与之相似我的应用程序,虽然这件事运动形式特殊的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后立即崩溃。任何想法为什么这件事情发生? 在我的情况下,它会抛出造成巨大的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事件。

,然后创建一个新的线程,让它永远运行下去,并不断移动的形式,创建一个新线程,等等...

所以,你应该做的,是创建一个方法(建议:称之为ROFL,YOLOSWAG),它会在产生新线程之前破坏线程。

+0

多数民众赞成在解释一切。此外,为什么只有当你移动表单时才重新绘制? – Vordex

+0

重新绘制总是会覆盖一部分面板,并且当该部件再次暴露给观察者时,必须重新重新绘制。 – Psi