Yes, You're right.
But I tried with the various delay.
If I increase the time of 10 seconds every 10 seconds, I have the same error.
consumed time. No resource is used.
Any reason you are upping your estimate by 10 seconds every
3 seconds? After two minutes your estimate is whopping 390
seconds = 6.5 minutes...
--
=====================================
Alexander Nickolov
Microsoft MVP [VC], MCSD
email: agnickolov@mvps.org
MVP VC FAQ: http://www.mvps.org/vcfaq
=====================================
"Fred" <Fred@discussions.microsoft.com> wrote in message
news:C5B5EDC3-990C-4339-B34A-9ECD44EB956F@microsoft.com...
Hi,
I've created a ATL service in VC++ (unmanaged code) on Visual Studio 2005.
Everything works fine.
But I still have a problem to stop my service.
During its termination, my service needs time to communicate with external
components (about 5 minutes).
When I stop my service from the "Control manager", my service enters in a
STOP_PENDING state. I start a independant thread which refresh its status
by
calling regularly SetServiceStatus.
But the "Control Manager" generates a 1053 error after a timeout of about
2
minutes.
After several days of work, I can't find the reason, so need help.
For information, there is my code:
void CMyServiceModule::OnStop()
{
this->LogEvent(_T("SERVICE_STOP_PENDING"));
m_status.dwWaitHint = 10000;
m_status.dwCheckPoint = 1;
SetServiceStatus(SERVICE_STOP_PENDING);
_beginthread( StopFunct, 0, (void *) this );
// PostThreadMessage(m_dwThreadID, WM_QUIT, 0, 0);
}
void StopFunct( void *ch )
{
CMyServiceModule *pThis= (CMyServiceModule *)ch;
DWORD dwStart = GetTickCount();
dwStart += 300000;
while (dwStart>GetTickCount()) {
pThis->m_status.dwWaitHint += 10000;
pThis->m_status.dwCheckPoint++;
pThis->SetServiceStatus(SERVICE_STOP_PENDING);
Sleep(3000);
}
PostThreadMessage(pThis->m_dwThreadID, WM_QUIT, 0, 0);
}
I used the SetServiceStatus which came from the parent class
(CAtlServiceModuleT):
void CAtlServiceModuleT::SetServiceStatus(DWORD dwState) throw()
{
m_status.dwCurrentState = dwState;
::SetServiceStatus(m_hServiceStatus, &m_status);
}
Thanks in advance....
--
Fred