2012-04-05 5 views
2

Ich bin mir nicht sicher, ob dies wirklich eine SharpDX-Frage oder eine allgemeine C# -Frage ist.Verlassen der SharpDX RenderLoop

SharpDX hat eine Schleife machen, die mit der Verwendung eines Delegierten läuft:

RenderLoop.Run(m_RenderForm,() => 
{ 
    // Do stuff here to render things... 
} 

Also, was ich tun muss, ist, die irgendwie Schleife machen zu verlassen.

RenderLoop.Run(m_RenderForm,() => 
{ 
    if(DoINeedToQuit() == true) 
    { 
     // What do I put here? 
    } 
} 

Ich kann nicht nur return, denn das ist nur die aktuelle Schleife endet und beginnt wieder am Anfang.

Antwort

1

Sie müssten die Anwendung (Application.Exit) beenden. Die andere Möglichkeit besteht darin, den Job außerhalb der Schleife innerhalb der Schleife auszuführen.

+0

Das ist es ziemlich viel. Speziell in SharpDX musste ich das enthaltende Formular mit 'm_RenderForm.Close()' schließen. – Cylindric

0

Andere Lösung ist, die Kontrolle zu zerstören „in dem“ renderLoop arbeitet zum Beispiel tun RenderForm.Close()

0

Sie es entsorgen können.

myDXControl.Dispose(); 

dann stoppt die Schleife. Um die Schleife neu zu starten, können Sie überprüfen, ob es entsorgt myDXControl.IsDisposed ist, dann können Sie das Steuerelement erneut initialisieren und die Schleife starten. hoffe es hilft

0

Sie können den Quellcode von SharpDX sehen und selbst eine Lösung finden. Wie auch immer ich mich in diesem Problem befand, und ich habe den Quellcode gesehen. Von ihm, hier ist der Code von Run:

public static void Run(Control form, RenderCallback renderCallback, bool useApplicationDoEvents = false) 
{ 
    if (form == null) 
     throw new ArgumentNullException("form"); 
    if (renderCallback == null) 
     throw new ArgumentNullException("renderCallback"); 
    form.Show(); 
    using (var renderLoop = new RenderLoop(form) { UseApplicationDoEvents = useApplicationDoEvents }) 
     while (renderLoop.NextFrame()) 
      renderCallback(); 
} 

Im while es eine Bedingung, um fortzufahren ist; Sie können einen and Operator dort hinzufügen:

private static bool cancelLoop = false; 

public static void Run(Control form, RenderCallback renderCallback, bool useApplicationDoEvents = false) 
{ 
    if (form == null) 
     throw new ArgumentNullException("form"); 
    if (renderCallback == null) 
     throw new ArgumentNullException("renderCallback"); 
    form.Show(); 
    using (var renderLoop = new RenderLoop(form) { UseApplicationDoEvents = useApplicationDoEvents }) 
     while (renderLoop.NextFrame() && !cancelLoop) 
      renderCallback(); 
    cancelLoop = false; 
} 

public static void CancelRun() 
{ 
    cancelLoop = true; 
} 
0

Als eines der ersten Plakate gezeigt hat, ist der Code recht einfach in der Schleife. Die Funktion, die Sie aufgerufen haben, ist der Bequemlichkeit halber, Sie könnten Ihre eigene Rolle einfach im Formular ausfüllen. Sie müssen Bibliotheken nicht erneut kompilieren, fügen Sie einfach eine Funktion zu Ihrem Formular hinzu, wenn application.exit nicht der einzige Exit-Trigger ist, den Sie möchten.