Ergebnis 1 bis 18 von 18

C# Graphics Absturz sobald Leerer Thread läuft

  1. #1 Zitieren
    Pretty Pink Pony Princess  Avatar von Multithread
    Registriert seit
    Jun 2010
    Ort
    Crystal Empire
    Beiträge
    11.234
    Hallo Zusammen

    Ich kriegs mal wieder nicht gebacken.

    Erstmal meine Hauptklasse:
    Spoiler:(zum lesen bitte Text markieren)
    Code:
     public class Spiel
      {
        Bitmap bmp = new Bitmap(1, 1);
        //Graphics g = null;
        List<IZeichenelement> elementlist = new List<IZeichenelement>();
    
        ThreadQueue tq = null;
        Queue q = null;
    
        int hight = 700;
        int width = 1300;
    
        public Spiel()
        {
          setSize(hight, width);
          elementlist.Add(new Linie(new Point(100, 500), new Point(400, 400), new Pen(Brushes.Black)));
          //tq = new ThreadQueue(3);
          q = new Queue();
        }
    
        public void setSize(int _hight, int _width)
        {
          this.hight = _hight;
          this.width = _width;
          bmp = new Bitmap(hight, width);
        }
    
        public Bitmap Zeichne()
        {
          Graphics g = Graphics.FromImage(bmp);
          g.FillRectangle(Brushes.White, 0, 0, 10000, 10000);
          foreach (IZeichenelement z in elementlist)
          {
            z.draw(g);
          }
          return bmp;
        }
    
        public bool addAufgabe(Aufgabe _aufgabe)
        {
          tq.addAufgabe(_aufgabe);
          return true;
        }
    
        public Bitmap getImage(int pos)
        {
          Bitmap b = tq.getResult(pos) as Bitmap;
          return b;
        }
      }

    Funktioniert alles, allerdings nur so lange bis ich meine ThreadQueue inizialisiere (Queue beinhaltet auch nur ThreadQueue), dann schmiert das Programm sofort ab mit folgender begründung
    [Bild: Fehlermeldung.png]

    Ich bin inzwischen relativ ratlos, habs schon mit Lock(g) versucht, hat aber auch nichts gebracht.

    Ich wäre froh wenn mir jemand einen Tipp geben könnte was ich noch versuchen könnte, bmp wird nur in spielk benutzt.
    [Bild: AMD_Threadripper.png] Bei Hardware gibt es keine eigene Meinung, bei Hardware zählen nur die Fakten.


    Probleme mit der Haarpracht? Starres Haar ohne Glanz? TressFX schafft Abhilfe. Ja, TressFX verhilft auch Ihnen zu schönem und Geschmeidigen Haar.
    [Bild: i6tfHoa3ooSEraFH63.png]
    Multithread ist offline

  2. #2 Zitieren
    Held Avatar von mainclain
    Registriert seit
    Sep 2005
    Beiträge
    5.426
    Das Problem wird aber eher bmp sein. Bitmaps sind soweit ich weiß nicht threadsafe und sollten dementsprechend über lock abgesichert werden.
    mainclain ist offline

  3. #3 Zitieren
    Pretty Pink Pony Princess  Avatar von Multithread
    Registriert seit
    Jun 2010
    Ort
    Crystal Empire
    Beiträge
    11.234
    Zitat Zitat von mainclain Beitrag anzeigen
    Das Problem wird aber eher bmp sein. Bitmaps sind soweit ich weiß nicht threadsafe und sollten dementsprechend über lock abgesichert werden.
    glaube ich nicht, manchmal trifft der fehler auch während dem Zeichnen auf

    Und wenn ich bmp locke kann ich den Fehler weiterhin erzeugen, bzw er entsteht weiterhin

    hab folgendes erfolglos Probiert:
    Spoiler:(zum lesen bitte Text markieren)
    Code:
        {
          lock (bmp)
          {
            Graphics g = Graphics.FromImage(bmp);
            lock (g)
            {
              g.FillRectangle(Brushes.White, 0, 0, 10000, 10000);
              foreach (IZeichenelement z in elementlist)
              {
                z.draw(g);
              }
            }
          }

    Würde dir der source code weiterhelfen?
    [Bild: AMD_Threadripper.png] Bei Hardware gibt es keine eigene Meinung, bei Hardware zählen nur die Fakten.


    Probleme mit der Haarpracht? Starres Haar ohne Glanz? TressFX schafft Abhilfe. Ja, TressFX verhilft auch Ihnen zu schönem und Geschmeidigen Haar.
    [Bild: i6tfHoa3ooSEraFH63.png]
    Multithread ist offline

  4. #4 Zitieren
    Held Avatar von mainclain
    Registriert seit
    Sep 2005
    Beiträge
    5.426
    Wann greifst du denn noch auf die bmp zu?

    Code:
        public Bitmap getImage(int pos)
        {       
             Bitmap b = tq.getResult(pos) as Bitmap;
                    return b;
         }
    z.b. benutzt du es irgendwo? Würde sich vll anbieten das bitmap zu locken (in allen Funktionen die dieses nutzen)
    Oder das Bitmap in getImage() zu kopieren?
    mainclain ist offline

  5. #5 Zitieren
    Pretty Pink Pony Princess  Avatar von Multithread
    Registriert seit
    Jun 2010
    Ort
    Crystal Empire
    Beiträge
    11.234
    Zitat Zitat von mainclain Beitrag anzeigen
    Wann greifst du denn noch auf die bmp zu?

    Code:
        public Bitmap getImage(int pos)
        {       
             Bitmap b = tq.getResult(pos) as Bitmap;
                    return b;
         }
    z.b. benutzt du es irgendwo? Würde sich vll anbieten das bitmap zu locken (in allen Funktionen die dieses nutzen)
    Oder das Bitmap in getImage() zu kopieren?
    Die Bitmap brauche ich an 4 Stellen, alle viel in der spiel Klasse.

    manchmal taucht der Fehler auch in dieser Zeile auf:
    Code:
          g.DrawLine(pen, point1, p2);
    Kopieren habe ich auch schon probiert, abgesehen von 2-4GB Ram verbrauch zusätzlich, hat sich dadurch nichts geändert.
    Den Fehler bekomme ich auch wenn ich das Bild grösser mache (3*FullHD auflösung).

    Aktuelle klasse:
    Spoiler:(zum lesen bitte Text markieren)
    Code:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Drawing;
    using FPS_Verteilung_Darstellen.Zeichenelemente;
    using Multithreading;
    using _2D_jump_n_run.Aufgaben;
    using System.Threading;
    
    namespace _2D_jump_n_run
    {
      public class Spiel
      {
        Bitmap bmp = new Bitmap(1, 1);
        //Graphics g = null;
       public  List<IZeichenelement> elementlist = new List<IZeichenelement>();
    
        ThreadQueue tq = null;
        Queue q = null;
    
        int hight = 700;
        int width = 1300;
    
        public Spiel()
        {
          setSize(hight, width);
          elementlist.Add(new Linie(new Point(100, 500), new Point(400, 400), new Pen(Brushes.Black)));
          //tq = new ThreadQueue(3);
          //q = new Queue();
        }
    
        public void run(object o)
        {
          Thread.Sleep(10000);
        }
    
        public void setSize(int _hight, int _width)
        {
          this.hight = _hight;
          this.width = _width;
          bmp = new Bitmap(hight, width);
        }
    
        public Bitmap Zeichne()
        {
          Graphics g = Graphics.FromImage(bmp);
          g.FillRectangle(Brushes.White, 0, 0, 10000, 10000);
          foreach (IZeichenelement z in elementlist)
          {
            z.draw(g);
          }
          return bmp;
        }
      }
    }
    [Bild: AMD_Threadripper.png] Bei Hardware gibt es keine eigene Meinung, bei Hardware zählen nur die Fakten.


    Probleme mit der Haarpracht? Starres Haar ohne Glanz? TressFX schafft Abhilfe. Ja, TressFX verhilft auch Ihnen zu schönem und Geschmeidigen Haar.
    [Bild: i6tfHoa3ooSEraFH63.png]
    Multithread ist offline

  6. #6 Zitieren
    Sergej Petrow
    Gast
    Kann man bei C# Exceptions abfangen?

    Da könnte man zumindest genau rausbekommen, wo die Exception geworfen wird.
    Oder, was noch besser ist (zumindest bei Java), gleich eine Alternativbehandlung vorschlagen.

    Auf die schnelle mal gegoogelt. Auch in C# geht das.
    Geändert von Sergej Petrow (27.04.2013 um 19:46 Uhr)

  7. #7 Zitieren
    Pretty Pink Pony Princess  Avatar von Multithread
    Registriert seit
    Jun 2010
    Ort
    Crystal Empire
    Beiträge
    11.234
    Zitat Zitat von Sergej Petrow Beitrag anzeigen
    Kann man bei C# Exceptions abfangen?

    Da könnte man zumindest genau rausbekommen, wo die Exception geworfen wird.
    Oder, was noch besser ist (zumindest bei Java), gleich eine Alternativbehandlung vorschlagen.

    Auf die schnelle mal gegoogelt. Auch in C# geht das.
    bringt mir nichts, wenn ich das mache, wird bei jedem nachfolgenden Aufruf wieder ne Exception geworfen

    und nach kürzester Zeit steht das Bild dann.


    e: bzw. ich habe dann kein Bild mehr, ist nix mehr da zum darstellen
    [Bild: AMD_Threadripper.png] Bei Hardware gibt es keine eigene Meinung, bei Hardware zählen nur die Fakten.


    Probleme mit der Haarpracht? Starres Haar ohne Glanz? TressFX schafft Abhilfe. Ja, TressFX verhilft auch Ihnen zu schönem und Geschmeidigen Haar.
    [Bild: i6tfHoa3ooSEraFH63.png]
    Multithread ist offline Geändert von Multithread (27.04.2013 um 21:57 Uhr)

  8. #8 Zitieren
    Held Avatar von mainclain
    Registriert seit
    Sep 2005
    Beiträge
    5.426
    Code:
    public  List<IZeichenelement> elementlist = new List<IZeichenelement>();
    Wieso ist dies public?

    Code:
    g.DrawLine(pen, point1, p2);
    Öhm öhm... wo steht das schon wieder?

    Die Bitmap brauche ich an 4 Stellen, alle viel in der spiel Klasse.
    Wozu dann die getImage() funktion?


    Und wo rufst du jetzt die Zeichnen funktion auf?
    mainclain ist offline

  9. #9 Zitieren
    Sergej Petrow
    Gast
    Zitat Zitat von Lara Croft Beitrag anzeigen
    bringt mir nichts, wenn ich das mache, wird bei jedem nachfolgenden Aufruf wieder ne Exception geworfen

    und nach kürzester Zeit steht das Bild dann.

    e: bzw. ich habe dann kein Bild mehr, ist nix mehr da zum darstellen
    Dann muss es ja irgendwas schwerwiegendes sein. Wobei, wenn Du die Exception auffängst, kann sie doch nicht danach wieder geworfen werden. Eventuell sind das dann wieder andere Exceptions.

    By the way, diese run methode

    Code:
     public void run(object o)
        {
          Thread.Sleep(10000);
        }
    Wie oft wird die aufgerufen? Sind das Millisekunden, dann wären das satte 10 Sekunden Unterbrechung.

    Dann noch eine andere Frage. Mit ThreadQueue willst Du drei Threads laufen lassen, verstehe ich das richtig? Wofür machst Du das? Soll das so eine Art Buffering sein?

  10. #10 Zitieren
    Pretty Pink Pony Princess  Avatar von Multithread
    Registriert seit
    Jun 2010
    Ort
    Crystal Empire
    Beiträge
    11.234
    Zitat Zitat von mainclain Beitrag anzeigen
    Code:
    public  List<IZeichenelement> elementlist = new List<IZeichenelement>();
    Wieso ist dies public?

    Code:
    g.DrawLine(pen, point1, p2);
    Öhm öhm... wo steht das schon wieder?


    Wozu dann die getImage() funktion?


    Und wo rufst du jetzt die Zeichnen funktion auf?
    public: damit ich von Form her darauf zugreifen kann.

    g.draw(); ist die Draw methode des IZeichenelement, in diesem fall von der Klasse Linie.

    getImage() war dazu gedacht um die Grafische Berechnung über die Threadqueue laufen zu lassen, aber diese kann ich aktuell nicht einmal
    Einschalten ohne Exceptions zu werfen im Graphics.

    Aufgerufen wird die Funktion aus Form1 heraus. Ich hab das ganze mal verfügbar gemacht, vielleicht hilft das auch etwas

    Zitat Zitat von Sergej Petrow Beitrag anzeigen
    Dann muss es ja irgendwas schwerwiegendes sein. Wobei, wenn Du die Exception auffängst, kann sie doch nicht danach wieder geworfen werden. Eventuell sind das dann wieder andere Exceptions.

    By the way, diese run methode

    Code:
     public void run(object o)
        {
          Thread.Sleep(10000);
        }
    Wie oft wird die aufgerufen? Sind das Millisekunden, dann wären das satte 10 Sekunden Unterbrechung.

    Dann noch eine andere Frage. Mit ThreadQueue willst Du drei Threads laufen lassen, verstehe ich das richtig? Wofür machst Du das? Soll das so eine Art Buffering sein?
    Diese Methode ist genau das was die zu scheinen scheint, eine Queue für Threadbare aufgaben, sobald ich eine aufgabe habe die nicht vom Haupthread erledigt werden muss (grössere Berechnungen, Festplattenzugriffe, alles was einen Moment dauert), erstelle ich dafür eine aufgabe die ich damit abarbeiten kann.
    aufgerufen wird die Run Methode so oft wie die Thread queue threads hat, meistens zwischen 3 und 10 Stück

    Dadurch kann ich Realtiv schnell anwendungen schreiben die mit mehr als einen Kern zurechtkommen, ist auch schon Praxiserprobt, nur die lock(){} sind neu.


    die Exception ist bdw. immer die gleiche, die Methode wird ja bei jedem Paint Aufruf den ich erzeuge aufgerufen.


    Um euch auch alles etwas einfacher zu machen:
    Project.zip -> 2D jum n run Ordner
    er wird die map datei zwar nicht finden, aber das ist halb so wild
    [Bild: AMD_Threadripper.png] Bei Hardware gibt es keine eigene Meinung, bei Hardware zählen nur die Fakten.


    Probleme mit der Haarpracht? Starres Haar ohne Glanz? TressFX schafft Abhilfe. Ja, TressFX verhilft auch Ihnen zu schönem und Geschmeidigen Haar.
    [Bild: i6tfHoa3ooSEraFH63.png]
    Multithread ist offline Geändert von Multithread (28.04.2013 um 20:47 Uhr)

  11. #11 Zitieren
    Held Avatar von mainclain
    Registriert seit
    Sep 2005
    Beiträge
    5.426
    Code:
     void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            lock (spiel)
            {
                Random rnd = new Random();
                spiel.elementlist.Add(new Linie(new Point(rnd.Next(1000), rnd.Next(1000)), new Point(rnd.Next(1000), rnd.Next(1000)), new Pen(Brushes.Black)));
                Bitmap bmp = spiel.Zeichne();
    
                this.BackgroundImage = null;
                this.BackgroundImage = (Image)bmp.Clone();
            }
        }
    lock(spiel) Damit nicht im schlimmsten fall das Zeichenn zu lange dauert und durch

    spiel.elementlist.Add(new Linie(new Point(rnd.Next(1000), rnd.Next(1000)), new Point(rnd.Next(1000),
    ein Error entsteht.



    this.BackgroundImage = (Image)bmp.Clone();
    Damit auf die bmp weiter zugegriffen werden kann. Hierbei entsteht aber so ein speicherleck (altes Bild muss gelöscht werden)

    Also (das ist hier noch nicht drin)
    statt this.BackgroundImage = null;
    ein
    Code:
    if (this.BackgroundImage != null)
    {
         this.BackgroundImage.Dispose();
    }
    bzw. danach kannste auch gerne nochmal auf null setzen.


    Allerdings wird beim ReRendern wohl ein Fehler auftreten, da der BackgroundImage im gleichen thread geändert werden sollte.
    Da wäre es vll besser auf Forms.Timer zurück zu greifen. Dieser sollte im gleichen Thread ablaufen ( wenn ich nicht ganz doof bin)



    Dass ich bei sowas immer soviel editiere... Erst denken dann schreiben... wann lern ichs endlich (Vergib mir, wenns ein wenig wirr ist, bin gerade stark unterzuckert, ich guck morgen nochmal drüber):


    Also du solltest auf Form-Elemente nur aus dem Form-Thread zugreifen. Dazu könntest du hier einen extra Timer schreiben:

    Code:
    t2 = new Timer();//System.Windows.Forms.Timer
    t2.Interval = 2;
    t2.Tick += new EventHandler(t2_Tick);
    t2.Start();
    Deine alte Timer-Funktion würde das aktuelle Bild einspeichern:
    Code:
     void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            lock (spiel)
            {
                Random rnd = new Random();
                spiel.elementlist.Add(new Linie(new Point(rnd.Next(1000), rnd.Next(1000)), new Point(rnd.Next(1000), rnd.Next(1000)), new Pen(Brushes.Black)));
                Bitmap bmp = spiel.Zeichne();
                this.bgImages = (Image)bmp;
            }
        }
    Hier muss es nun nicht mehr kopiert werden, da wir das im anderen Timer machen

    Code:
    void t2_Tick(object sender, EventArgs e)
        {
            lock (spiel)
            {
                if (this.BackgroundImage != null)
                {
                    this.BackgroundImage.Dispose();
                }
                this.BackgroundImage = (Image)this.bgImages.Clone();
    
            }
        }
    Hier löschen wir das alte Bild und kopieren es. Da wir spiel locken sollte es auch kein problem mit der bmp geben.
    Da wir hier direkt im Form-Thread arbeiten, sollte es auch vor Zugriffen von der Form gesichert sein :P (z.b. neues Rendern beim verändern der Fenster größe)
    mainclain ist offline Geändert von mainclain (28.04.2013 um 23:18 Uhr)

  12. #12 Zitieren
    Pretty Pink Pony Princess  Avatar von Multithread
    Registriert seit
    Jun 2010
    Ort
    Crystal Empire
    Beiträge
    11.234
    Zitat Zitat von mainclain Beitrag anzeigen
    Code:
     void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            lock (spiel)
            {
                Random rnd = new Random();
                spiel.elementlist.Add(new Linie(new Point(rnd.Next(1000), rnd.Next(1000)), new Point(rnd.Next(1000), rnd.Next(1000)), new Pen(Brushes.Black)));
                Bitmap bmp = spiel.Zeichne();
    
                this.BackgroundImage = null;
                this.BackgroundImage = (Image)bmp.Clone();
            }
        }
    Getan, hat ne leichte Verbesserung gebracht. Deutliche Besserung, keine Abstürze mehr, aber sobald ich die Thread Queue inizialisiere (noch ganz ohne fremd Code der darin ausgeführt wird) verliere ich irgendwann das Bild, und es flackert, selbst bei nur 100FPS.


    Zitat Zitat von mainclain Beitrag anzeigen
    lock(spiel) Damit nicht im schlimmsten fall das Zeichenn zu lange dauert und durch

    spiel.elementlist.Add(new Linie(new Point(rnd.Next(1000), rnd.Next(1000)), new Point(rnd.Next(1000),
    ein Error entsteht.
    zumindest elementlist selber hat bisher keine abstürze verursacht, war dennoch eine gute idee.


    Zitat Zitat von mainclain Beitrag anzeigen
    this.BackgroundImage = (Image)bmp.Clone();
    Damit auf die bmp weiter zugegriffen werden kann. Hierbei entsteht aber so ein speicherleck (altes Bild muss gelöscht werden)

    Also (das ist hier noch nicht drin)
    statt this.BackgroundImage = null;
    ein
    Code:
    if (this.BackgroundImage != null)
    {
         this.BackgroundImage.Dispose();
    }
    Dann wird mir nichts mehr angezeigt, Dispose verursacht meinen Aktuellen Fehler (Weiss mit Rotem Rahmen und 2 roten Diagonalen)


    Zitat Zitat von mainclain Beitrag anzeigen
    bzw. danach kannste auch gerne nochmal auf null setzen.


    Allerdings wird beim ReRendern wohl ein Fehler auftreten, da der BackgroundImage im gleichen thread geändert werden sollte.
    Da wäre es vll besser auf Forms.Timer zurück zu greifen. Dieser sollte im gleichen Thread ablaufen ( wenn ich nicht ganz doof bin)
    Zumindest DA bin ich mir sicher das es vom Form1 Thread aufgerufen wird, das event wird nur vom Timer t aufgerufen.


    Zitat Zitat von mainclain Beitrag anzeigen

    Dass ich bei sowas immer soviel editiere... Erst denken dann schreiben... wann lern ichs endlich (Vergib mir, wenns ein wenig wirr ist, bin gerade stark unterzuckert, ich guck morgen nochmal drüber):


    Also du solltest auf Form-Elemente nur aus dem Form-Thread zugreifen. Dazu könntest du hier einen extra Timer schreiben:

    Code:
    t2 = new Timer();//System.Windows.Forms.Timer
    t2.Interval = 2;
    t2.Tick += new EventHandler(t2_Tick);
    t2.Start();
    Deine alte Timer-Funktion würde das aktuelle Bild einspeichern:
    Code:
     void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            lock (spiel)
            {
                Random rnd = new Random();
                spiel.elementlist.Add(new Linie(new Point(rnd.Next(1000), rnd.Next(1000)), new Point(rnd.Next(1000), rnd.Next(1000)), new Pen(Brushes.Black)));
                Bitmap bmp = spiel.Zeichne();
                this.bgImages = (Image)bmp;
            }
        }
    Dafür gibt es Invoke, damit kann ich den aktuellen Thread aufwecken wenn ich solche Zugriffe brauche



    Zitat Zitat von mainclain Beitrag anzeigen
    Hier muss es nun nicht mehr kopiert werden, da wir das im anderen Timer machen

    Code:
    void t2_Tick(object sender, EventArgs e)
        {
            lock (spiel)
            {
                if (this.BackgroundImage != null)
                {
                    this.BackgroundImage.Dispose();
                }
                this.BackgroundImage = (Image)this.bgImages.Clone();
    
            }
        }
    Hier löschen wir das alte Bild und kopieren es. Da wir spiel locken sollte es auch kein problem mit der bmp geben.
    Da wir hier direkt im Form-Thread arbeiten, sollte es auch vor Zugriffen von der Form gesichert sein :P (z.b. neues Rendern beim verändern der Fenster größe)
    Schön wärs, sobald ich die ThreadQueue starte, bekomme ich sehr schnell als BackgroundImage das Fehlerimage (roter rahmen und 2 rote Diagonalen), wenn ich das jetzt noch abfangen könnte.
    [Bild: AMD_Threadripper.png] Bei Hardware gibt es keine eigene Meinung, bei Hardware zählen nur die Fakten.


    Probleme mit der Haarpracht? Starres Haar ohne Glanz? TressFX schafft Abhilfe. Ja, TressFX verhilft auch Ihnen zu schönem und Geschmeidigen Haar.
    [Bild: i6tfHoa3ooSEraFH63.png]
    Multithread ist offline

  13. #13 Zitieren
    Held Avatar von mainclain
    Registriert seit
    Sep 2005
    Beiträge
    5.426
    Zitat Zitat von Lara Croft Beitrag anzeigen
    zumindest elementlist selber hat bisher keine abstürze verursacht, war dennoch eine gute idee.
    Wirds aber, der verwendete Timer ( zumindest im hochgeladenen Code) wird jedes mal in einem seperaten Thread gestartet. Dauerte die letzte Timer funktion also länger als der interval, kommt hier ein fehler.
    Deshalb muss es gelockt werden. Bei mir gabs mit den unteren 2 codes die ich gepostet hatte übrigends gar keine Fehler mehr.



    Zitat Zitat von Lara Croft Beitrag anzeigen
    Dann wird mir nichts mehr angezeigt, Dispose verursacht meinen Aktuellen Fehler (Weiss mit Rotem Rahmen und 2 roten Diagonalen)
    Dispose löscht das Bild. Bestimmte Klassen müssen ihre Resourcen wieder freigeben. Die Image Klasse gehört dazu. Wenn du also Dispose anwendest, musst du danach das neue Bild hinzufügen.



    Zitat Zitat von Lara Croft Beitrag anzeigen
    Zumindest DA bin ich mir sicher das es vom Form1 Thread aufgerufen wird, das event wird nur vom Timer t aufgerufen.
    Timer t ist kein System.Windows.Forms.Timer sondern ein System.Timers.Timer.
    Der Timer startet also in einem seperaten Thread.


    Zitat Zitat von Lara Croft Beitrag anzeigen
    Dafür gibt es Invoke, damit kann ich den aktuellen Thread aufwecken wenn ich solche Zugriffe brauche
    Gut, dieses hast du noch nicht benutzt, geht natürlich



    Zitat Zitat von Lara Croft Beitrag anzeigen
    Schön wärs, sobald ich die ThreadQueue starte, bekomme ich sehr schnell als BackgroundImage das Fehlerimage (roter rahmen und 2 rote Diagonalen), wenn ich das jetzt noch abfangen könnte.
    Im hochgeladenen beispiel hast du doch gar keine ThreadQueue mehr verwendet oder? Habs nichtmehr im Kopf.


    Hier nochmal die Änderungen der Form1.cs die ich, im gestern hochgeladenen Bsp, gemacht hatte:

    Code:
    t2 = new Timer();
    t2.Interval = 2;
    t2.Tick += new EventHandler(t2_Tick);
    t2.Start();
    Code:
        void t2_Tick(object sender, EventArgs e)
        {
            lock (spiel)
            {
                if (this.BackgroundImage != null)
                {
                    this.BackgroundImage.Dispose();
                }
                this.BackgroundImage = (Image)this.bgImages.Clone();
    
            }
        }

    Code:
        void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            lock (spiel)
            {
                Random rnd = new Random();
                spiel.elementlist.Add(new Linie(new Point(rnd.Next(1000), rnd.Next(1000)), new Point(rnd.Next(1000), rnd.Next(1000)), new Pen(Brushes.Black)));
                Bitmap bmp = spiel.Zeichne();
                this.bgImages = (Image)bmp;
            }
        }
    Invoken wäre da sicher die bessere Lösung.


    Ansonsten bin ich mir nicht sicher, wo die aktuellen Probleme liegen.
    mainclain ist offline Geändert von mainclain (29.04.2013 um 19:50 Uhr)

  14. #14 Zitieren
    Pretty Pink Pony Princess  Avatar von Multithread
    Registriert seit
    Jun 2010
    Ort
    Crystal Empire
    Beiträge
    11.234
    Es war der verdammte Timer

    Ich glaubs einfach nicht

    Jetzt muss ich das Bild auch nicht mehr Klonen, kann die Threadqueue akivieren, und und und.
    Jetzt muss ich nur noch die anzahl Frames pro sekunde erhöhen, im worst case eben auch über directX

    Für kollisisionsberechnungen will ich ja OpenCL nehmen, das ist der hauptgrund wieso ich mir dies Antuhe
    [Bild: AMD_Threadripper.png] Bei Hardware gibt es keine eigene Meinung, bei Hardware zählen nur die Fakten.


    Probleme mit der Haarpracht? Starres Haar ohne Glanz? TressFX schafft Abhilfe. Ja, TressFX verhilft auch Ihnen zu schönem und Geschmeidigen Haar.
    [Bild: i6tfHoa3ooSEraFH63.png]
    Multithread ist offline

  15. #15 Zitieren
    Held Avatar von mainclain
    Registriert seit
    Sep 2005
    Beiträge
    5.426
    Zitat Zitat von Lara Croft Beitrag anzeigen
    Jetzt muss ich nur noch die anzahl Frames pro sekunde erhöhen, im worst case eben auch über directX
    Wenn du da ernsthaft was vor hast, würde ich eh über XNA gehen
    mainclain ist offline

  16. #16 Zitieren
    Pretty Pink Pony Princess  Avatar von Multithread
    Registriert seit
    Jun 2010
    Ort
    Crystal Empire
    Beiträge
    11.234
    Zitat Zitat von mainclain Beitrag anzeigen
    Wenn du da ernsthaft was vor hast, würde ich eh über XNA gehen
    Ich hab überhaupt nicht vor über DirectX zu gehen.

    OpenGL schon eher


    Das ist aber nur ein Notfallprotokoll fals ich mit meiner aktuellen Implementation nicht über 30-40 FPS hinauskommen sollte (damit andere Ihre 20FPS haben). Die Graka soll ja 'nur' für Kollisionsberechnungen herhalten müssen.
    [Bild: AMD_Threadripper.png] Bei Hardware gibt es keine eigene Meinung, bei Hardware zählen nur die Fakten.


    Probleme mit der Haarpracht? Starres Haar ohne Glanz? TressFX schafft Abhilfe. Ja, TressFX verhilft auch Ihnen zu schönem und Geschmeidigen Haar.
    [Bild: i6tfHoa3ooSEraFH63.png]
    Multithread ist offline

  17. #17 Zitieren
    Pretty Pink Pony Princess  Avatar von Multithread
    Registriert seit
    Jun 2010
    Ort
    Crystal Empire
    Beiträge
    11.234
    Weiss jemand rat:
    Ich kriege maximal 20 Bilder in der Sekunde heraus, das ist aber zu wenig, gibt es irgendwelche Möglichkeiten da mehr rauszuholen?

    Also andere Bitmap, anderen weg zu zeichnen, irgendwas.
    Ansonsten muss ich wohl echt auf XNA ausweichen.

    EDIT: Hat sich erledigt. Wenn man Events werfen will, sollte man eventuell Testen ob da überhaupt jemand drauf hört
    Ich habe Tausende nullpointerExceptions pro Sekunde geworfen
    [Bild: AMD_Threadripper.png] Bei Hardware gibt es keine eigene Meinung, bei Hardware zählen nur die Fakten.


    Probleme mit der Haarpracht? Starres Haar ohne Glanz? TressFX schafft Abhilfe. Ja, TressFX verhilft auch Ihnen zu schönem und Geschmeidigen Haar.
    [Bild: i6tfHoa3ooSEraFH63.png]
    Multithread ist offline Geändert von Multithread (30.04.2013 um 19:56 Uhr)

  18. #18 Zitieren
    Sergej Petrow
    Gast
    NullPointerExceptions kann man ja sehr gut abfangen. Die kann man überhaupt auch sehr gut eliminieren. Ist ja nur, dass man eine nicht initialisierte Variable befragt, was halt nicht sein darf und auch nicht sein muss.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •