[MPlayer-cvslog] r25020 - trunk/gui/win32/interface.c

zuxy subversion at mplayerhq.hu
Sun Nov 11 09:14:58 CET 2007


Author: zuxy
Date: Sun Nov 11 09:14:57 2007
New Revision: 25020

Log:
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().



Modified:
   trunk/gui/win32/interface.c

Modified: trunk/gui/win32/interface.c
==============================================================================
--- trunk/gui/win32/interface.c	(original)
+++ trunk/gui/win32/interface.c	Sun Nov 11 09:14:57 2007
@@ -59,6 +59,8 @@ static gui_t *mygui = NULL;
 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 @@ void mplFullScreen( void )
     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 @@ static DWORD WINAPI GuiThread(void)
        gtkAutoSync = autosync;
     }
 
-    while(mygui)
+    while(GetMessage(&msg, NULL, 0, 0))
     {
-        GetMessage(&msg, NULL, 0, 0);
         TranslateMessage(&msg);
         DispatchMessage(&msg);
     }
@@ -486,12 +487,11 @@ static DWORD WINAPI GuiThread(void)
 
 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 @@ void guiDone(void)
     {
         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 */



More information about the MPlayer-cvslog mailing list