- Improve start / stop control - Use GetSelectedService exclusively Modified: trunk/reactos/subsys/system/servman/control.c Modified: trunk/reactos/subsys/system/servman/query.c Modified: trunk/reactos/subsys/system/servman/start.c _____
Modified: trunk/reactos/subsys/system/servman/control.c --- trunk/reactos/subsys/system/servman/control.c 2006-01-22 23:29:53 UTC (rev 20994) +++ trunk/reactos/subsys/system/servman/control.c 2006-01-22 23:35:43 UTC (rev 20995) @@ -23,6 +23,7 @@
LVITEM item; DWORD BytesNeeded = 0; DWORD Loop = 5; //FIXME: testing value. needs better control + DWORD dwStartTickCount, dwOldCheckPoint;
item.mask = LVIF_PARAM; item.iItem = GetSelectedItem(); @@ -72,15 +73,28 @@ return FALSE; }
+ /* Save the tick count and initial checkpoint. */ + dwStartTickCount = GetTickCount(); + dwOldCheckPoint = ServiceStatus.dwCheckPoint; + /* loop whilst service is not running */ /* FIXME: needs more control adding. 'Loop' is temparary */ while (ServiceStatus.dwCurrentState != Control || !Loop) { + DWORD dwWaitTime; + + dwWaitTime = ServiceStatus.dwWaitHint / 10; + + if( dwWaitTime < 500 ) + dwWaitTime = 500; + else if ( dwWaitTime > 5000 ) + dwWaitTime = 5000; + /* increment the progress bar */ SendMessage(hProgBar, PBM_STEPIT, 0, 0);
/* wait before checking status */ - Sleep(ServiceStatus.dwWaitHint / 8); + Sleep(dwWaitTime);
/* check status again */ if (! QueryServiceStatusEx( @@ -93,7 +107,22 @@ GetError(0); return FALSE; } - Loop--; + + if (ServiceStatus.dwCheckPoint > dwOldCheckPoint) + { + /* The service is making progress. increment the progress bar */ + SendMessage(hProgBar, PBM_STEPIT, 0, 0); + dwStartTickCount = GetTickCount(); + dwOldCheckPoint = ServiceStatus.dwCheckPoint; + } + else + { + if(GetTickCount() - dwStartTickCount > ServiceStatus.dwWaitHint) + { + /* No progress made within the wait hint */ + break; + } + } }
CloseServiceHandle(hSc); _____
Modified: trunk/reactos/subsys/system/servman/query.c --- trunk/reactos/subsys/system/servman/query.c 2006-01-22 23:29:53 UTC (rev 20994) +++ trunk/reactos/subsys/system/servman/query.c 2006-01-22 23:35:43 UTC (rev 20995) @@ -96,15 +96,10 @@
SC_HANDLE hSc = NULL; LPQUERY_SERVICE_CONFIG pServiceConfig = NULL; ENUM_SERVICE_STATUS_PROCESS *Service = NULL; - LVITEM item; DWORD BytesNeeded = 0;
- item.mask = LVIF_PARAM; - item.iItem = GetSelectedItem(); - SendMessage(hListView, LVM_GETITEM, 0, (LPARAM)&item); - /* copy pointer to selected service */ - Service = (ENUM_SERVICE_STATUS_PROCESS *)item.lParam; + Service = GetSelectedService();
/* open handle to the SCM */ hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE); _____
Modified: trunk/reactos/subsys/system/servman/start.c --- trunk/reactos/subsys/system/servman/start.c 2006-01-22 23:29:53 UTC (rev 20994) +++ trunk/reactos/subsys/system/servman/start.c 2006-01-22 23:35:43 UTC (rev 20995) @@ -19,17 +19,13 @@
SC_HANDLE hSc; SERVICE_STATUS_PROCESS ServiceStatus; ENUM_SERVICE_STATUS_PROCESS *Service = NULL; - LVITEM item; DWORD BytesNeeded = 0; INT ArgCount = 0; DWORD Loop = 5; //FIXME: testing value. needs better control + DWORD dwStartTickCount, dwOldCheckPoint;
- item.mask = LVIF_PARAM; - item.iItem = GetSelectedItem(); - SendMessage(hListView, LVM_GETITEM, 0, (LPARAM)&item); - /* copy pointer to selected service */ - Service = (ENUM_SERVICE_STATUS_PROCESS *)item.lParam; + Service = GetSelectedService();
/* set the progress bar range and step */ hProgBar = GetDlgItem(hProgDlg, IDC_SERVCON_PROGRESS); @@ -70,10 +66,23 @@ return FALSE; }
+ /* Save the tick count and initial checkpoint. */ + dwStartTickCount = GetTickCount(); + dwOldCheckPoint = ServiceStatus.dwCheckPoint; + /* loop whilst service is not running */ /* FIXME: needs more control adding. 'Loop' is temparary */ while (ServiceStatus.dwCurrentState != SERVICE_RUNNING || !Loop) { + DWORD dwWaitTime; + + dwWaitTime = ServiceStatus.dwWaitHint / 10; + + if( dwWaitTime < 500 ) + dwWaitTime = 500; + else if ( dwWaitTime > 5000 ) + dwWaitTime = 5000; + /* increment the progress bar */ SendMessage(hProgBar, PBM_STEPIT, 0, 0);
@@ -91,7 +100,22 @@ GetError(0); return FALSE; } - Loop--; + + if (ServiceStatus.dwCheckPoint > dwOldCheckPoint) + { + /* The service is making progress. increment the progress bar */ + SendMessage(hProgBar, PBM_STEPIT, 0, 0); + dwStartTickCount = GetTickCount(); + dwOldCheckPoint = ServiceStatus.dwCheckPoint; + } + else + { + if(GetTickCount() - dwStartTickCount > ServiceStatus.dwWaitHint) + { + /* No progress made within the wait hint */ + break; + } + } }
CloseServiceHandle(hSc);