Laden...

[gelöst] System.NullReferenceException bei Beenden von DirectX Anwendung

Erstellt von markus111 vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.336 Views
markus111 Themenstarter:in
479 Beiträge seit 2008
vor 15 Jahren
[gelöst] System.NullReferenceException bei Beenden von DirectX Anwendung

Hallo,

ich bastel mir grade eine (kleine) DirectX Anwendung, hab aber ein etwas merkwürdiges Problem:
Wenn ich auf Schließen drücke, wird eine System.NullReferenceException 'geworfen'.
Es wird auch nicht angezeigt (also z.B. Pfeil bzw Zeilennummer), wo diese Exception genau ausgelößt wird.

Die Exception:

System.NullReferenceException wurde nicht behandelt.
  Message="Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
  Source="Microsoft.DirectX.Direct3DX"
  StackTrace:
       bei Microsoft.DirectX.Direct3D.Font.OnLostDevice()
       bei Microsoft.DirectX.Direct3D.Font.OnParentLost(Object sender, EventArgs e)
       bei System.EventHandler.Invoke(Object sender, EventArgs e)
       bei Microsoft.DirectX.Direct3D.Device.raise_DeviceLost(Object i1, EventArgs i2)
       bei Microsoft.DirectX.Direct3D.Device.Finalize()
  InnerException: 

Da der Code über 375 Zeilen lang ist, habe ich ihn als Anhang hinzugefügt.

Ich hoffe mir kann jemand helfen.

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
1.200 Beiträge seit 2007
vor 15 Jahren

Würde mal sagen, du solltest in OnPaint abfragen ob das Device noch da ist.

if(Device == null) return;

Ausserdem räumst du ja nirgends sauber auf. Ziemlich sicher ist, dass irgendein EventHandler auf dem Close aufgerufen wird, der versucht auf etwas zuzugreifen, was schon weg ist.

Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!

YARRRRRR!

markus111 Themenstarter:in
479 Beiträge seit 2008
vor 15 Jahren

Würde mal sagen, du solltest in OnPaint abfragen ob das Device noch da ist.

if(Device == null) return;  

Hm.....
Das bringt auch nichts. Er zeigt immer noch diese Exception ohne Auslösepunkt an.

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
5.658 Beiträge seit 2006
vor 15 Jahren

Wenn das Fenster geschlossen wird, wird auch das dazugehörige Device "geresettet". In dem Moment versuchst du, deine Text-Resourcen neu zu erstellen. Das kann nicht funktionieren.

Christian

Weeks of programming can save you hours of planning

markus111 Themenstarter:in
479 Beiträge seit 2008
vor 15 Jahren

Das bringt alles nichts.....
Hab alles versucht.
Hier ist nochmal die OnPaint()-Methode:


        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            if (IsDeviceReseted || IsDeviceLost || Device == null) return; // IsDeviceReseted und IsDeviceLost sind false, sobald der DeviceReseted, bzw. DeviceLost EventHandler ausgelößt wird, wird die entsprechende Variable true

            QueryPerformanceFrequency(out Freq);
            QueryPerformanceCounter(ref LastFrame);

            device.Clear(ClearFlags.Target, BackColor3D, 0.0f, 0);

            device.BeginScene();
            device.VertexFormat = CustomVertex.PositionColored.Format;
            device.SetStreamSource(0, vb, 0);
            device.Indices = ib;

            device.Transform.World = Matrix.Translation(PositionX, PositionY, PositionZ) * Matrix.RotationYawPitchRoll(AngleY, AngleX, AngleZ);

            device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, WIDTH * HEIGHT, 0, indices.Length / 3);

            text.DrawText(null, "FPS: " + fps.ToString(), new Point(5, 5), Color.Red);

            device.EndScene();

            device.Present();

            this.Invalidate(false);

            ReadKeyboard();
            
            QueryPerformanceCounter(ref CurrentFrame);

            fps = Freq / (CurrentFrame - LastFrame);
        }

Vielleicht irgendein komischer anderer Fehler?

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
5.658 Beiträge seit 2006
vor 15 Jahren

Das bringt alles nichts.....
Hab alles versucht.

Bezieht sich das auf meinen Beitrag? Wenn ja, kannst du das evtl. etwas näher ausführen?

Weeks of programming can save you hours of planning

markus111 Themenstarter:in
479 Beiträge seit 2008
vor 15 Jahren

Eigendlich schon.
Hier ist nochmal der komplette Code.

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
5.658 Beiträge seit 2006
vor 15 Jahren

Was genau ist deine Frage? Warum die Exception geworfen wird, hab ich doch oben geschrieben.

Wenn du genauere Angaben zur Exception haben willst, mußt du in den Debug-Output schauen.

Weeks of programming can save you hours of planning

markus111 Themenstarter:in
479 Beiträge seit 2008
vor 15 Jahren

Nein, eigentlich wollte ich wissen, was ich dagegen tun kann...
Hab nämlich nichts vernünftiges gefunden.

Nochmal die Exception:

System.NullReferenceException wurde nicht behandelt.
  Message="Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
  Source="Microsoft.DirectX.Direct3DX"
  StackTrace:
       bei Microsoft.DirectX.Direct3D.Font.OnLostDevice()
       bei Microsoft.DirectX.Direct3D.Font.OnParentLost(Object sender, EventArgs e)
       bei System.EventHandler.Invoke(Object sender, EventArgs e)
       bei Microsoft.DirectX.Direct3D.Device.raise_DeviceLost(Object i1, EventArgs i2)
       bei Microsoft.DirectX.Direct3D.Device.Finalize()
  InnerException: 

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
5.658 Beiträge seit 2006
vor 15 Jahren

Die DirectX-Exceptions nützen gar nichts. Aussagekräftige Infos gibt es nur imDebug-Output, wenn du die DirectX-Debug Version aktiviert hast.

Da kannst du die Exception und den Code noch 15x posten, damit hilfst du weder uns noch dir. Bitte unbedingt [Hinweis] Wie poste ich richtig? Punkt 4, 4.1, 5 (dazu gehört die DirectX-Info wie oben erwähnt), 8 und 9 beachten, sonst kommen wir hier nicht weiter!

Danke.

Weeks of programming can save you hours of planning

markus111 Themenstarter:in
479 Beiträge seit 2008
vor 15 Jahren

Hallo,

ich hab hier eine Lösung gefunden: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=965131&SiteID=1

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)