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
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!
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
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
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
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
Eigendlich schon.
Hier ist nochmal der komplette Code.
mfg.
markus111
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
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
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
Hallo,
ich hab hier eine Lösung gefunden: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=965131&SiteID=1
mfg.
markus111