diff --git a/Source/Examples/ExampleLauncher.cs b/Source/Examples/ExampleLauncher.cs
index 8b9f291b..28ccaff5 100644
--- a/Source/Examples/ExampleLauncher.cs
+++ b/Source/Examples/ExampleLauncher.cs
@@ -29,49 +29,41 @@ namespace Examples
{
public partial class ExampleLauncher : Form
{
- ///
- /// The main entry point for the application.
- ///
- [STAThread]
- static void Main()
- {
- try
- {
- if (File.Exists("debug.log"))
- File.Delete("debug.log");
- }
- catch (Exception e)
- {
- MessageBox.Show("Could not access debug.log", e.ToString());
- }
-
- Debug.Listeners.Clear();
- Debug.Listeners.Add(new TextWriterTraceListener("debug.log"));
- Debug.Listeners.Add(new ConsoleTraceListener());
- Debug.AutoFlush = true;
-
- try
- {
- using (Form exampleLauncher = new ExampleLauncher())
- {
- Application.EnableVisualStyles();
- Application.Run(exampleLauncher);
- }
- }
- finally
- {
- Debug.Flush();
- Debug.Close();
- Trace.Flush();
- Trace.Close();
- }
- }
+ SortedList examples = new SortedList();
public ExampleLauncher()
{
InitializeComponent();
}
+ public void ExampleLauncher_Load(object sender, EventArgs e)
+ {
+ // Get all examples
+ Type[] types = Assembly.GetExecutingAssembly().GetTypes();
+ foreach (Type type in types)
+ {
+ if (type.GetInterface("IExample") != null)
+ {
+ examples.Add(
+ type.Namespace.Replace("Examples.", String.Empty) + " " +
+ type.Name.Substring(1, 2) + ": " +
+ type.Name.Substring(3).Replace('_', ' '),
+ type.Namespace + "." + type.Name);
+ }
+ }
+
+ foreach (string s in examples.Keys)
+ listBox1.Items.Add(s);
+
+ // Select first item
+ if (listBox1.Items.Count > 0)
+ {
+ this.listBox1.SelectedIndex = 0;
+ }
+ }
+
+ delegate void LaunchDelegate(object example);
+
void Launch(object example)
{
Type ex = example as Type;
@@ -81,32 +73,8 @@ namespace Examples
}
catch (Exception expt)
{
- MessageBox.Show(String.Format("Stacktrace:{0}{1}{0}{0}Inner exception:{0}{2}",
- System.Environment.NewLine, expt.StackTrace, expt.InnerException), expt.Message);
- }
- }
-
- public void ExampleLauncher_Load(object sender, EventArgs e)
- {
- SortedList sl = new SortedList();
-
- // Get all examples
- Type[] types = Assembly.GetExecutingAssembly().GetTypes();
- foreach (Type type in types)
- {
- if (type.GetInterface("IExample") != null)
- {
- sl.Add((type.Namespace.Replace("Examples.", String.Empty) + ": " + type.Name).Replace('_', ' '), null);
- }
- }
-
- foreach (string s in sl.Keys)
- listBox1.Items.Add(s);
-
- // Select first item
- if (listBox1.Items.Count > 0)
- {
- this.listBox1.SelectedIndex = 0;
+ MessageBox.Show(String.Format("Stacktrace:{0}{1}{0}{0}Inner exception:{0}{2}",
+ System.Environment.NewLine, expt.StackTrace, expt.InnerException), expt.Message);
}
}
@@ -114,19 +82,22 @@ namespace Examples
{
if (listBox1.SelectedItem != null)
{
- Type example =
- Assembly.GetExecutingAssembly().GetType(
- "Examples." + listBox1.SelectedItem.ToString().Replace(": ", ".").Replace(' ', '_'),
- true,
- true);
+ Type example = Assembly.GetExecutingAssembly().GetType(
+ examples[listBox1.SelectedItem.ToString()], true, true);
Debug.Print("Launching example: {0}", example.ToString());
+ this.Visible = false;
if (example.BaseType == typeof(GameWindow))
{
// Start the GameWindow in a new thread - it runs its own message loop, and it would
// interfere with the message loop of the ExampleLauncher.
- new Thread(Launch).Start(example);
+ //Thread t = new Thread(Launch);
+ //t.Start(example);
+ //t = null;
+ Launch(example);
+ //IAsyncResult res = BeginInvoke(new LaunchDelegate(Launch), example);
+ //EndInvoke(res);
}
else if (example.BaseType == typeof(Form))
{
@@ -134,7 +105,10 @@ namespace Examples
{
// In this we do not want a different thread: these examples rely on the Application.Idle
// event, which would then be raised by both the ExampleLauncher thread *and* the new one!
- this.AddOwnedForm((Form)example.GetConstructor(Type.EmptyTypes).Invoke(null));
+ Form f = (Form)example.GetConstructor(Type.EmptyTypes).Invoke(null);
+ f.ShowDialog(this);
+ f.Dispose();
+ f = null;
}
catch (Exception expt)
{
@@ -146,8 +120,16 @@ namespace Examples
expt.InnerException
),
expt.Message);
+
+ throw;
}
}
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ this.Visible = true;
}
}
@@ -170,5 +152,43 @@ namespace Examples
{
RunExample();
}
+
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ try
+ {
+ if (File.Exists("debug.log"))
+ File.Delete("debug.log");
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show("Could not access debug.log", e.ToString());
+ }
+
+ Debug.Listeners.Clear();
+ Debug.Listeners.Add(new TextWriterTraceListener("debug.log"));
+ Debug.Listeners.Add(new ConsoleTraceListener());
+ Debug.AutoFlush = true;
+
+ try
+ {
+ using (Form exampleLauncher = new ExampleLauncher())
+ {
+ Application.EnableVisualStyles();
+ Application.Run(exampleLauncher);
+ }
+ }
+ finally
+ {
+ Debug.Flush();
+ Debug.Close();
+ Trace.Flush();
+ Trace.Close();
+ }
+ }
}
}
diff --git a/Source/Examples/IExample.cs b/Source/Examples/IExample.cs
index a1c36e0a..92ab0bbf 100644
--- a/Source/Examples/IExample.cs
+++ b/Source/Examples/IExample.cs
@@ -11,8 +11,8 @@ using System.Text;
namespace Examples
{
///
- /// Examples should implement this (empty) interface, so that the ExampleLauncher
- /// can identify them.
+ /// This interface is is used by the ExampleLauncher to identify OpenTK examples,
+ /// your applications do not need to implement or use it.
///
interface IExample
{