none
Microsoft.DirectX.Direct3D.InvalidCallException: "Fehler in der Anwendung." RRS feed

  • Allgemeine Diskussion

  • Hallo Leute, folgender Code wirft die als Bild aufgezeigte Exception aus:

    Die Methode StartThread() löst die Exception ausWo liegt der Bug?Was mache ich falsch?

    Es muss möglich sein, die FPS auszugeben und sollte eigentlich funktionieren. Funktioniert nur leider nüscht!

    using System;
    using System.Windows.Forms;
    using System.Drawing;
    using System.Threading;
    using Microsoft.DirectX.Direct3D;
    using Microsoft.DirectX.DirectInput;
    using System.IO;
    
    namespace Game4
    {
        public partial class Form1 : Form
        {
            private Microsoft.DirectX.Direct3D.Device device;
            private Microsoft.DirectX.DirectInput.Device keyboard;
            private Microsoft.DirectX.Direct3D.Font font;
            private Texture texture, anotherTexture;
            private Thread thread;
            private int x = 0, y = 0, fps=0,frames=0;
            long timeStarted = Environment.TickCount;
            private static int OriginX = -300, OriginY = -150;
            private float rotation = 0.00f;
            public Form1()
            {
                this.WindowState = System.Windows.Forms.FormWindowState.Normal;
                InitializeComponent();
                InitDevice();
                InitKeyboard();
                InitFont();
                TextureLoad();
            }
            private void TextureLoad()
            {
                string currentDir = Environment.CurrentDirectory;
                string filename = "space.jpg";
                string anotherFilename = "plane.jpg";
                if (!File.Exists(currentDir + "/" + filename) || !File.Exists(currentDir + "/" + anotherFilename))
                    MessageBox.Show("Die Datei " + filename + " konnte im Ordner " + currentDir + " nicht geladen werden");
                else
                {
                    texture = TextureLoader.FromFile(device, filename);
                    anotherTexture = TextureLoader.FromFile(device, anotherFilename, 200, 200, 1, 0, Format.A8R8G8B8, Pool.Managed, Filter.Point, Filter.Point, Color.Transparent.ToArgb());
                }
            }
            private void InitDevice()
            {
                PresentParameters pp = new PresentParameters();
                pp.Windowed = true;
                pp.SwapEffect = SwapEffect.Discard;
                device = new Microsoft.DirectX.Direct3D.Device(0, Microsoft.DirectX.Direct3D.DeviceType.Hardware, this, CreateFlags.HardwareVertexProcessing, pp);
            }
            private void InitKeyboard()
            {
                keyboard = new Microsoft.DirectX.DirectInput.Device(SystemGuid.Keyboard);
                keyboard.SetCooperativeLevel(this, CooperativeLevelFlags.NonExclusive | CooperativeLevelFlags.Background);
                keyboard.Acquire();
            }
            private void UpdateInput()
            {
                foreach (Key k in keyboard.GetPressedKeys())
                {
                    if (k == Key.RightArrow && checkBox1.Checked == false)
                    {
                        x += 2;
                    }
                    else if (k == Key.RightArrow && checkBox1.Checked == true)
                    {
                        x += 6;
                    }
                    if (k == Key.LeftArrow && checkBox1.Checked == false)
                    {
                        x -= 2;
                    }
                    else if (k == Key.LeftArrow && checkBox1.Checked == true)
                    {
                        x -= 6;
                    }
                    if (k == Key.DownArrow && checkBox1.Checked == false)
                    {
                        y += 2;
                    }
                    else if (k == Key.DownArrow && checkBox1.Checked == true)
                    {
                        y += 6;
                    }
                    if (k == Key.UpArrow && checkBox1.Checked == false)
                    {
                        y -= 2;
                    }
                    else if (k == Key.UpArrow && checkBox1.Checked == true)
                    {
                        y -= 6;
                    }
                    if (k == Key.PageUp)
                    {
                        rotation += 0.1f;
                    }
                    if (k == Key.PageDown)
                    {
                        rotation -= 0.1f;
                    }
                }
            }
            private void InitFont()
            {
                System.Drawing.Font f = new System.Drawing.Font("Times New Roman", 16, FontStyle.Strikeout);
                font = new Microsoft.DirectX.Direct3D.Font(device, f);
            }
    
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                StartThread();
            }
    
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                StopThread();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                this.WindowState = System.Windows.Forms.FormWindowState.Normal;
            }
    
            private void Render()
            {
                while (true)
                {
                    string text = "Press Arrow-Keys to move me!";
                    string anotherText = "Press PageUp/PageDown to rotate me!";
                    UpdateInput();
                    device.Clear(ClearFlags.Target, Color.Aquamarine, 0, 1);
                    device.BeginScene();
                    using (Sprite s = new Sprite(device))
                    {
                        s.Begin(SpriteFlags.AlphaBlend);
                        s.Draw2D(texture, new Rectangle(0, 0, 0, 0), new Rectangle(0, 0, device.Viewport.Width, device.Viewport.Height), new Point(0, 0), 0f, new Point(0, 0), Color.White);
                        Microsoft.DirectX.Matrix matrix = new Microsoft.DirectX.Matrix();
                        matrix = Microsoft.DirectX.Matrix.Transformation2D(new Microsoft.DirectX.Vector2(0, 0), 0.00f, new Microsoft.DirectX.Vector2(1.0f, 1.0f), new Microsoft.DirectX.Vector2(x + 325, y + 325), rotation, new Microsoft.DirectX.Vector2(0, 0));
                        s.Transform = matrix;
                        s.Draw(anotherTexture, new Rectangle(), new Microsoft.DirectX.Vector3(OriginX, OriginY, 0), new Microsoft.DirectX.Vector3(x, y, 0), Color.White);
                        s.End();
                    }
                    using (Sprite b = new Sprite(device))
                    {
                        b.Begin(SpriteFlags.AlphaBlend);
                        font.DrawText(b, text, new Point(270, 60), Color.White);
                        font.DrawText(b, anotherText, new Point(270, 80), Color.White);
                        font.DrawText(b,"FPS:"+fps, new Point(0, 40), Color.White);
                        b.End();
    
                    }
                    device.EndScene();
                    device.Present();
                    if(Environment.TickCount >= timeStarted + 1000)
                    {
                        fps = frames;
                        frames = 0;
                        timeStarted = Environment.TickCount;
                    }
                    frames++;
                }
            }
            private void button1_Click(object sender, EventArgs e)
            {
                Application.Exit();
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                //UpdateInput();
                //Render();
            }
            private void StartThread()
            {
                thread = new Thread(new ThreadStart(this.Render));//dieser Aufruf verursacht die Exception
                thread.Start();
            }
            private void StopThread()
            {
                thread.Abort();
            }
        }
    }



    Sonntag, 6. Mai 2018 13:47

Alle Antworten

  • Hallo tklenin,

    Diese Ausnahme tritt auf, wenn BeginScene innerhalb eines BeginScene-EndScene-Paares aufgerufen wird.

    Es kann sein, dass der Fehler hardwarebezogen ist und durch eine andere Grafikkarte behoben werden kann (siehe zum Beispiel diesen Thread). Um dies zu überprüfen, kannst Du Dich des Programms DxDiag (von Microsoft) bedienen, das unter %windir%\system32\dxdiag.exe zu finden ist (sieh Dir auch diesen Artikel an).

    Was wird angezeigt, wenn Du unter Debuggen -> Ausnahmen alles aktivierst (standardmäßig ist nur "Vom Benutzercode unbehandelt" ausgewählt)? Würdest Du auch die Stapelüberwachung veröffentlichen?

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 7. Mai 2018 13:39
    Administrator
  • dxdiag.exe meldet keinerlei Auffälligkeiten oder Probleme. Wo finde ich die Option Debuggen -> Ausnahmen. Unter Debuggen gibt es nur: Optionen und Eigenschaften. Unter beiden Unterpunkten finde ich nirgends die Option Ausnahmen Wie aktiviere ich die Stapelüberwachung?
    Dienstag, 8. Mai 2018 16:17
  • Hallo tklenin,

    Wie aktiviere ich die Stapelüberwachung?

    Klicke im Fenster mit dem Ausnahmefehler auf Details anzeigen und klappe die Fehlermeldung aus. Dort ist die StackTrace (Stapelüberwachung) zu finden.

    Wo finde ich die Option Debuggen -> Ausnahmen.

    In Visual Studio 2017 findest Du sie in der Menüleiste (Debuggen) -> Fenster -> Ausnahmeeinstellungen, in Visual Studio 2013 in der Menüleiste (Debuggen) -> Ausnahmen. In beiden Fällen geht es auch mit Strg+Alt+E.

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 9. Mai 2018 14:11
    Administrator