2017-03-11 5 views
-4

nach dem großen Kampf schrieb ich "Game Engine" und ich fand sehr seltsame Bug. Wenn Sie Ihr Formular verschieben, erhalten Sie OutOfMemory-Ausnahme (Anwendung springt von weniger als 24 MB auf mehr als 6 GB RAM in weniger als 5 Sekunden), aber das ist nicht das seltsamste Ding. Dies erscheint NUR, wenn Sie sich in eine andere Richtung bewegen. hier ist Stück Code, das ich schrieb, die identisch wie als meine Anwendung funktioniert, obwohl dies bis zu bewegen Form sofort nach stürzteigentümlich OutOfMemory Ausnahme

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(); 
    } 
} 

}

Formular Grenze Stil singleFixed gesetzt. irgendeine Idee, warum dieses Ding passiert? in meinem Fall ist es andere Ausnahme von enormer RAM-Auslastung verursacht wirft aber es scheint, auch nur, wenn Sie

+0

Haben Sie es profiliert? – Carcigenicate

+0

mit einer Variablen namens WTF ist die C# Hintertür für nasale Dämonen, deshalb komische Dinge passieren :) –

Antwort

5

Dies ist kein Bug bilden nach oben zu verschieben, ist es das Ergebnis Ihrer übermäßigen Thread-Erzeugung:

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

Jedes Mal, wenn das Panel neu gezeichnet wird (was normalerweise geschieht, wenn es aufgrund von Fensterbewegungen ungültig gemacht wird), erstellen Sie einen neuen Thread (Aufruf WOOT, Creative-Name übrigens). Dieser Thread wird jedoch für immer ausgeführt (siehe , auch ein Creative-Name)

Sobald Sie also mit dem Verschieben beginnen, werden das Formular und Teile dieses Bereichs ungültig (z. B. wenn sie von etwas anderem oder von außerhalb des Bildschirms abgedeckt werden). Sobald sie wieder angezeigt werden, wird das Ereignis Paint ausgelöst.

Und dann, Sie einen neuen Thread erstellen, lassen Sie es für immer laufen, und weiterhin die Form zu bewegen, einen neuen Thread zu schaffen, und so weiter ...

Also, was Sie tun sollen, ist es, ein Verfahren zu schaffen, (Vorschlag: ROFL, YOLO oder SWAG), der den Thread zerstört, bevor er einen neuen erstellt.

+0

das alles erklärt. Auch warum repaint es nur, wenn Sie Form umziehen? – Vordex

+0

Es repaints immer ein Teil Ihres Panels ist bedeckt und muss erneut übermalt werden, wenn das Teil wieder dem Betrachter ausgesetzt ist. – Psi