changeset 24992:5701e23ebcb4

Better handling of win32 GUI thread: 1. Use _beginthreadex to create the GUI thread to avoid possible memory leak when linked to MS CRT. 2. Terminate the GUI thread in an cleaner way using PostThreadMessage() rather than the unrecommended TerminateThread().
author zuxy
date Sun, 11 Nov 2007 08:14:57 +0000
parents 72bc6377fb28
children 9c8e2a9b1c7a
files gui/win32/interface.c
diffstat 1 files changed, 8 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/gui/win32/interface.c	Sun Nov 11 02:58:45 2007 +0000
+++ b/gui/win32/interface.c	Sun Nov 11 08:14:57 2007 +0000
@@ -59,6 +59,8 @@
 static int update_subwindow(void);
 static RECT old_rect;
 static DWORD style;
+static HANDLE hThread;
+static unsigned threadId;
 ao_functions_t *audio_out = NULL;
 vo_functions_t *video_out = NULL;
 mixer_t *mixer = NULL;
@@ -459,7 +461,7 @@
     if(sub_window) ShowWindow(mygui->subwindow, SW_SHOW);
 }
 
-static DWORD WINAPI GuiThread(void)
+static unsigned __stdcall GuiThread(void* param)
 {
     MSG msg;
 
@@ -473,9 +475,8 @@
        gtkAutoSync = autosync;
     }
 
-    while(mygui)
+    while(GetMessage(&msg, NULL, 0, 0))
     {
-        GetMessage(&msg, NULL, 0, 0);
         TranslateMessage(&msg);
         DispatchMessage(&msg);
     }
@@ -486,12 +487,11 @@
 
 void guiInit(void)
 {
-    DWORD threadId;
     memset(&guiIntfStruct, 0, sizeof(guiIntfStruct));
     /* Create The gui thread */
     if (!mygui)
     {
-        CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) GuiThread, NULL, 0, &threadId);
+        hThread = _beginthreadex(NULL, 0, GuiThread, NULL, 0, &threadId);
         mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] Creating GUI Thread 0x%04x\n", threadId);
     }
 
@@ -506,9 +506,11 @@
     {
         fprintf(stderr, "[GUI] Closed by main mplayer window\n");
         fflush(stderr);
+        PostThreadMessage(threadId, WM_QUIT, 0, 0);
+        WaitForSingleObject(hThread, INFINITE);
+        CloseHandle(hThread);
         mygui->uninit(mygui);
         free(mygui);
-        TerminateThread(GuiThread, 0);
         mygui = NULL;
     }
     /* Remove tray icon */