Hi,
ich hab einen Thread der mir auf eine Bitmap zufällig viele Rectangles zeichnen soll, aber es passiert nichts.
Hier mal der Code des Threads:
private void calculate_effects()
{
while (effect_thread_active)
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(delegate { perform_effect(ref rec_count); }));
this.Invoke(new MethodInvoker(delegate { this.Invalidate(); }));
}
else
{
perform_effect(ref rec_count);
}
Thread.Sleep(100);
}
}
Und hier der Code der im Thread ausgeführt wird:
private void perform_effect(ref int rec_count)
{
Bitmap new_bitmap = new Bitmap(225,225);
img_point i_p = new img_point();
int x = 0;
int y = 0;
foreach (Render_Effects_ render_effect in render_effects)
{
using (var graphics = Graphics.FromImage(new_bitmap))
{
Rectangle rec_limit = new Rectangle(render_effect.location.X - 75, render_effect.location.Y - 75, 225, 225);
for (int i = 0; i < 100; i++)
{
Rectangle rec = new Rectangle(_rnd.Next(0, this.Width), _rnd.Next(0, this.Height), 20, 20);
if (rec.IntersectsWith(rec_limit))
{
graphics.DrawRectangle(new Pen(new SolidBrush(Color.Black)), new Rectangle(rec_limit.X + 75, rec_limit.Y + 75, 20, 20));
MessageBox.Show(i.ToString());
}
}
}
new_bitmap.Save(Path.GetFullPath(Environment.CurrentDirectory) + @"\Properties\img.png");
}
Environment.Exit(0);
}
Das gespeicherte Bild ist weiß bzw. leer. Ich weiß aber nicht warum, kann mir jemand helfen?
Hast du das debuggt und geschaut ob wirklich was gezeichnet wird? Stimmen die Werte, zeichnet es in den sichtbaren Bereich oder eventuell außerhalb? Du weißt dass du etwas anderes auf IntersectsWith prüfst als dann tatsächlich gezeichnet wird?
Dein Code macht übrigens nicht viel Sinn wenn du die ganze Arbeit zwar in einen Thread packst und sie dann aber mit Invoke wieder in den Hauptthread verlagerst.
Invalidate nur bei InvokeRequired?
sooooo habs jetzt so gelöst:
private void calculate_effects()
{
while (effect_thread_active)
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(delegate
{
effects.Clear();
Bitmap new_bitmap = new Bitmap(225, 225);
img_point i_p = new img_point();
int x = 0;
int y = 0;
foreach (Render_Effects_ render_effect in render_effects)
{
using (var graphics = Graphics.FromImage(new_bitmap))
{
Rectangle rec_limit = new Rectangle(render_effect.location.X - 75, render_effect.location.Y - 75, 225, 225);
for (int i = 0; i < 10; i++)
{
Rectangle rec = new Rectangle(_rnd.Next(0, 225), _rnd.Next(0, 225), 20, 20);
graphics.DrawRectangle(new Pen(new SolidBrush(Color.Black)), rec);
}
x = render_effect.location.X - 75;
y = render_effect.location.Y - 75;
}
i_p.img = new_bitmap;
i_p.pnt = new Point(x, y);
effects.Add(i_p);
}
}));
this.Invoke(new MethodInvoker(delegate { this.Invalidate(); }));
}
else
{
effects.Clear();
Bitmap new_bitmap = new Bitmap(225, 225);
img_point i_p = new img_point();
int x = 0;
int y = 0;
foreach (Render_Effects_ render_effect in render_effects)
{
using (var graphics = Graphics.FromImage(new_bitmap))
{
Rectangle rec_limit = new Rectangle(render_effect.location.X - 75, render_effect.location.Y - 75, 225, 225);
for (int i = 0; i < 10; i++)
{
Rectangle rec = new Rectangle(_rnd.Next(0, 225), _rnd.Next(0, 225), 20, 20);
graphics.DrawRectangle(new Pen(new SolidBrush(Color.Black)), rec);
}
x = render_effect.location.X - 75;
y = render_effect.location.Y - 75;
}
new_bitmap.Save(Path.GetFullPath(Environment.CurrentDirectory) + @"\Properties\img.png");
i_p.img = new_bitmap;
i_p.pnt = new Point(x, y);
effects.Add(i_p);
}
this.Invalidate();
}
Thread.Sleep(100);
}
}
Doppelter Code? Also wenn der jetzt wenigstens funtioniert könntest du das ja auch noch kürzen.
Kürzen hab ich noch vor, ich bin erstmal froh das ich mein Ziel erreicht hab 😉