Salut,
Un Sleep(...) peut l'argement suffire et n'occupe pas le proc pour rien.
Par contre éteindre ou redémarrer l'ordinateur sous Win2K, c'est autre chose. Voici une vielle routine (sous VC++ 6.0) qui permet de faire cela sur n'importe quel Win (jamais testé sous XP).
A+
------------------------
#include "stdafx.h"
// WinXExitWindowsEx adaptée d'un exemple de David Gerhart (voir ExitWindowsEx)
int WinXExitWindowsEx(UINT uFlags)
{
int ret;
OSVERSIONINFO ver;
ret=0;
ver.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
if (!GetVersionEx(&ver))
ret=GetLastError();
else
{
if (ver.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS) // Win 95/98
{
if (!ExitWindowsEx(uFlags,0))
ret=GetLastError();
}
else if (ver.dwPlatformId==VER_PLATFORM_WIN32_NT) // Win NT/2K
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// Avant d'utiliser ExitWindowsEx, il faut avoir le privilège SE_SHUTDOWN_NAME
if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken))
ret=GetLastError();
else
{
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
if (GetLastError() != ERROR_SUCCESS)
ret=GetLastError();
else
{
if (!ExitWindowsEx(uFlags,0))
ret=GetLastError();
}
}
}
else
ret=-1;
}
return(ret);
}
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
Sleep(1000*60*30); // attente de 30mn (en ms) sans utiliser de temps processeur
WinXExitWindowsEx(EWX_REBOOT); // reboot
return 0;
}