Create threads to manage timers instead of using the service thread.

diff --git a/misc/system.c b/misc/system.c
index 57d3660..4196aa3 100644
--- a/misc/system.c
+++ b/misc/system.c
@@ -22,7 +22,6 @@
 #include "wingdi.h"
 #include "wine/winbase16.h"
 #include "wine/winuser16.h"
-#include "services.h"
 #include "stackframe.h"
 #include "wine/debug.h"
 
@@ -41,16 +40,18 @@
 
 static SYSTEM_TIMER SYS_Timers[NB_SYS_TIMERS];
 static int SYS_NbTimers = 0;
-static HANDLE SYS_Service = INVALID_HANDLE_VALUE;
-
+static HANDLE SYS_timer;
+static HANDLE SYS_thread;
+static int SYS_timers_disabled;
 
 /***********************************************************************
  *           SYSTEM_TimerTick
  */
-static void CALLBACK SYSTEM_TimerTick( ULONG_PTR arg )
+static void CALLBACK SYSTEM_TimerTick( LPVOID arg, DWORD low, DWORD high )
 {
     int i;
 
+    if (SYS_timers_disabled) return;
     for (i = 0; i < NB_SYS_TIMERS; i++)
     {
         if (!SYS_Timers[i].callback) continue;
@@ -62,6 +63,22 @@
     }
 }
 
+
+/***********************************************************************
+ *           SYSTEM_TimerThread
+ */
+static DWORD CALLBACK SYSTEM_TimerThread( void *dummy )
+{
+    LARGE_INTEGER when;
+
+    if (!(SYS_timer = CreateWaitableTimerA( NULL, FALSE, NULL ))) return 0;
+
+    when.s.LowPart = when.s.HighPart = 0;
+    SetWaitableTimer( SYS_timer, &when, (SYS_TIMER_RATE+500)/1000, SYSTEM_TimerTick, 0, FALSE );
+    for (;;) WaitForMultipleObjectsEx( 0, NULL, FALSE, INFINITE, TRUE );
+}
+
+
 /**********************************************************************
  *           SYSTEM_StartTicks
  *
@@ -69,8 +86,7 @@
  */
 static void SYSTEM_StartTicks(void)
 {
-    if ( SYS_Service == INVALID_HANDLE_VALUE )
-        SYS_Service = SERVICE_AddTimer( (SYS_TIMER_RATE+500)/1000, SYSTEM_TimerTick, 0L );
+    if (!SYS_thread) SYS_thread = CreateThread( NULL, 0, SYSTEM_TimerThread, NULL, 0, NULL );
 }
 
 
@@ -81,10 +97,13 @@
  */
 static void SYSTEM_StopTicks(void)
 {
-    if ( SYS_Service != INVALID_HANDLE_VALUE )
+    if (SYS_thread)
     {
-        SERVICE_Delete( SYS_Service );
-        SYS_Service = INVALID_HANDLE_VALUE;
+        CancelWaitableTimer( SYS_timer );
+        TerminateThread( SYS_thread, 0 );
+        CloseHandle( SYS_thread );
+        CloseHandle( SYS_timer );
+        SYS_thread = 0;
     }
 }
 
@@ -186,8 +205,7 @@
  */
 void WINAPI EnableSystemTimers16(void)
 {
-    if ( SYS_Service != INVALID_HANDLE_VALUE )
-        SERVICE_Enable( SYS_Service );
+    SYS_timers_disabled = 0;
 }
 
 
@@ -196,8 +214,7 @@
  */
 void WINAPI DisableSystemTimers16(void)
 {
-    if ( SYS_Service != INVALID_HANDLE_VALUE )
-        SERVICE_Disable( SYS_Service );
+    SYS_timers_disabled = 1;
 }