OSDN Git Service

Made the disposal of the scene viewer idempotent.
authorLatif Khalifa <latifer@streamgrid.net>
Thu, 1 Sep 2011 02:08:29 +0000 (02:08 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Thu, 1 Sep 2011 02:08:29 +0000 (02:08 +0000)
Destroying of OpenGL context now done on their respective threads (in hope it will help prevent CPU pegging that sometimes happen on control shutdown).

git-svn-id: https://radegast.googlecode.com/svn/trunk@1124 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/GUI/Rendering/Rendering.cs

index e5f7731..901b32f 100644 (file)
@@ -205,7 +205,13 @@ namespace Radegast.Rendering
             RenderingEnabled = false;\r
             Application.Idle -= new EventHandler(Application_Idle);\r
 \r
-            PendingTextures.Close();\r
+            if (!PendingTextures.Closed)\r
+            {\r
+                TextureThreadContextReady.Reset();\r
+                TextureThreadRunning = false;\r
+                PendingTextures.Close();\r
+                TextureThreadContextReady.WaitOne(5000, false);\r
+            }\r
 \r
             if (chatOverlay != null)\r
             {\r
@@ -223,7 +229,11 @@ namespace Radegast.Rendering
             Client.Avatars.AvatarAppearance -= new EventHandler<AvatarAppearanceEventArgs>(Avatars_AvatarAppearance);\r
             Client.Appearance.AppearanceSet -= new EventHandler<AppearanceSetEventArgs>(Appearance_AppearanceSet);\r
 \r
-            PendingTasks.Close();\r
+            if (!PendingTasks.Closed)\r
+            {\r
+                PendingTasks.Close();\r
+            }\r
+\r
             if (genericTaskThread != null)\r
             {\r
                 genericTaskThread.Join(2000);\r
@@ -249,6 +259,8 @@ namespace Radegast.Rendering
 \r
             if (glControl != null)\r
             {\r
+                glControl_UnhookEvents();\r
+                glControl.MakeCurrent();\r
                 glControl.Dispose();\r
             }\r
             glControl = null;\r
@@ -593,10 +605,8 @@ namespace Radegast.Rendering
             glControl.BringToFront();\r
         }\r
 \r
-        void glControl_Disposed(object sender, EventArgs e)\r
+        void glControl_UnhookEvents()\r
         {\r
-            TextureThreadRunning = false;\r
-            PendingTextures.Close();\r
             glControl.Paint -= glControl_Paint;\r
             glControl.Resize -= glControl_Resize;\r
             glControl.MouseDown -= glControl_MouseDown;\r
@@ -605,6 +615,11 @@ namespace Radegast.Rendering
             glControl.MouseWheel -= glControl_MouseWheel;\r
             glControl.Load -= new EventHandler(glControl_Load);\r
             glControl.Disposed -= glControl_Disposed;\r
+\r
+        }\r
+        void glControl_Disposed(object sender, EventArgs e)\r
+        {\r
+            glControl_UnhookEvents();\r
         }\r
 \r
         void SetSun()\r
@@ -618,8 +633,11 @@ namespace Radegast.Rendering
             GL.Light(LightName.Light0, LightParameter.Position, sunPos);\r
         }\r
 \r
+        bool glControlLoaded = false;\r
         void glControl_Load(object sender, EventArgs e)\r
         {\r
+            if (glControlLoaded) return;\r
+\r
             try\r
             {\r
                 GL.ShadeModel(ShadingModel.Smooth);\r
@@ -704,6 +722,7 @@ namespace Radegast.Rendering
                 InitWater();\r
                 InitShaders();\r
                 RenderingEnabled = true;\r
+                glControlLoaded = true;\r
                 LoadCurrentPrims();\r
             }\r
             catch (Exception ex)\r
@@ -1081,8 +1100,10 @@ namespace Radegast.Rendering
                 item.TGAData = null;\r
                 imageBytes = null;\r
             }\r
+            context.MakeCurrent(window.WindowInfo);\r
             context.Dispose();\r
             window.Dispose();\r
+            TextureThreadContextReady.Set();\r
             Logger.DebugLog("Texture thread exited");\r
         }\r
         #endregion Texture thread\r