internal override void Run() { Debug.Assert(InitCallback != null); Debug.Assert(RunCallback != null); // Initialize the init callback InitCallback(); if (GameContext.IsUserManagingRun) { GameContext.RunCallback = RunCallback; GameContext.ExitCallback = ExitCallback; } else { var runCallback = new WindowsMessageLoop.RenderCallback(RunCallback); // Run the rendering loop try { WindowsMessageLoop.Run(Control, () => { if (Exiting) { if (Control != null) { Control.Dispose(); Control = null; } return; } runCallback(); }); } finally { if (ExitCallback != null) { ExitCallback(); } } } }
/// <summary> /// Runs the specified main loop for the specified windows form. /// </summary> /// <param name="form">The form.</param> /// <param name="renderCallback">The rendering callback.</param> /// <param name="useApplicationDoEvents">if set to <c>true</c> indicating whether the render loop should use the default <see cref="Application.DoEvents"/> instead of a custom window message loop lightweight for GC. Default is false.</param> /// <exception cref="System.ArgumentNullException">form /// or /// renderCallback</exception> 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 WindowsMessageLoop(form) { UseApplicationDoEvents = useApplicationDoEvents }) { while (renderLoop.NextFrame()) { renderCallback(); } } }
/// <summary> /// Runs the specified main loop for the specified windows form. /// </summary> /// <param name="form">The form.</param> /// <param name="renderCallback">The rendering callback.</param> /// <param name="useApplicationDoEvents">if set to <c>true</c> indicating whether the render loop should use the default <see cref="Application.DoEvents"/> instead of a custom window message loop lightweight for GC. Default is false.</param> /// <exception cref="System.ArgumentNullException">form /// or /// renderCallback</exception> 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 WindowsMessageLoop(form) { UseApplicationDoEvents = useApplicationDoEvents }) { while(renderLoop.NextFrame()) { renderCallback(); } } }