2009-07-25 9 views
3

J'écris du code c/C++ sous Windows en utilisant Visual Studio. Je veux savoir comment calculer efficacement l'heure de début de mon processus. Puis-je utiliser gettimeofday()? J'ai trouvé le code suivant à partir de Google, mais je ne comprends pas ce qu'il fait vraiment:Calculez par programme l'heure de début d'un processus sous Windows

int gettimeofday(struct timeval *tv, struct timezone *tz) 
{ 
    FILETIME ft; 
    unsigned __int64 tmpres = 0; 
    static int tzflag; 

    if (NULL != tv) 
    { 
    GetSystemTimeAsFileTime(&ft); 

    //I'm lost at this point 
    tmpres |= ft.dwHighDateTime; 
    tmpres <<= 32; 
    tmpres |= ft.dwLowDateTime; 

    /*converting file time to unix epoch*/ 
    tmpres /= 10; /*convert into microseconds*/ 
    tmpres -= DELTA_EPOCH_IN_MICROSECS; 
    tv->tv_sec = (long)(tmpres/1000000UL); 
    tv->tv_usec = (long)(tmpres % 1000000UL); 
    } 

    if (NULL != tz) 
    { 
    if (!tzflag) 
    { 
     _tzset(); 
     tzflag++; 
    } 
    tz->tz_minuteswest = _timezone/60; 
    tz->tz_dsttime = _daylight; 
    } 

    return 0; 
} 
+0

GMan, comment avez-vous le code pour regarder agréable? J'ai essayé d'utiliser les étiquettes de code, mais cela n'a pas fonctionné. –

+0

Vous devez pré-attacher chaque ligne avec quatre espaces, pas seulement le premier. – GManNickG

+0

Je pense que vous devez être plus précis sur ce que vous entendez par "calculer l'heure de début". Voulez-vous être en mesure de l'imprimer sous une forme lisible par l'homme, par ex. "Juillet 24, 2009, 20:14"? Ou voulez-vous l'utiliser dans un calcul, par ex. pour mesurer le temps écoulé depuis la dernière exécution de votre programme? Ou autre chose? La réponse dépend de ce que vous voulez faire avec la valeur de temps. –

Répondre

7

Si je vous comprends bien, vous voulez savoir à quelle heure votre processus a commencé, non? Donc, vous voudrez regarder dans GetProcessTimes (http://msdn.microsoft.com/en-us/library/ms683223(VS.85).aspx). Si le processus qui vous intéresse est le processus en cours, vous pouvez utiliser GetCurrentProcess() pour obtenir le handle de processus que vous aurez besoin d'appeler GetProcessTimes(); cela retourne un pseudo-handle que vous n'avez pas besoin de fermer.

+0

C'est la bonne réponse. – Foredecker

3

Ma question est close. Je trouve l'exemple de GetProcessTime à partir du shapshot du processus et certains gars donnent un lien avec cette question.

Je suis sorti et ce qui est mon exemple:

HANDLE hSnapshot; //variable for save snapshot of process 
PROCESSENTRY32 Entry; //variable for processing with snapshot 
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //do snapshot 
Entry.dwSize = sizeof(Entry); //assign size of Entry variables 
Process32First(hSnapshot, &Entry); //assign Entry variable to start of snapshot 
HANDLE hProc; //this variable for handle process 
SYSTEMTIME sProcessTime; // this variable for get system (usefull) time 
FILETIME fProcessTime, ftExit, ftKernel, ftUser; // this variables for get process start time and etc. 
do 
{ 
    hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Entry.th32ProcessID);//Open process for all access 
    GetProcessTimes(hProc, &fProcessTime, &ftExit, &ftKernel, &ftUser);//Get process time 
    FileTimeToSystemTime(&fProcessTime, &sProcessTime); //and now, start time of process at sProcessTime variable at usefull format. 
} while (Process32Next(hSnapshot, &Entry)); //while not end of list(snapshot) 
Questions connexes