Advertisement
Guest User

Untitled

a guest
Mar 12th, 2018
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "windows.h"
  2.  
  3. #include "conio.h"
  4. #include "stdio.h"
  5. #include "stdint.h"
  6.  
  7. /** Всего проводится NUMBER_OF_MEASURINGS серий измерений, каждая серия содержит
  8. * по NUMBER_OF_LAUNCHES запусков, при каждом запуске окно программы задерживается на экране
  9. * на LATENCY_BEFORE_TERMINATE_IN_MS миллисекунд.
  10. */
  11. #define NUMBER_OF_APPLICATIONS 2
  12. #define NUMBER_OF_MEASURINGS 2
  13. #define NUMBER_OF_LAUNCHES 2
  14. #define LATENCY_BEFORE_TERMINATE_IN_MS 500
  15.  
  16. /** Созданное окно перемещается в точку с координатами LEFT_UPPER_CORNER_X : LEFT_UPPER_CORNER_Y
  17. * и его размер меняется на размер LENGTH : WIDTH
  18. */
  19. #define LEFT_UPPER_CORNER_X 0
  20. #define LEFT_UPPER_CORNER_Y 0
  21. #define LENGTH 100
  22. #define WIDTH 100
  23. #define HIDE 1
  24.  
  25. void printErrorAndExit(char* functionName)
  26. {
  27.     printf("Error %i while calling %s", GetLastError(), functionName);
  28.     exit(EXIT_SUCCESS);
  29. }
  30.  
  31. BOOL CALLBACK enumAndResizeCallbackProc(HWND hwnd, LPARAM processHandle)
  32. {
  33.     DWORD buffForHandles = 0;
  34.     int result = 0;
  35.  
  36.     result = GetWindowThreadProcessId(hwnd, &buffForHandles);
  37.     if (result == 0)
  38.     {
  39.         printErrorAndExit("GetWindowThreadProcessId");
  40.     }
  41.  
  42.     if (buffForHandles == processHandle)
  43.     {
  44.         buffForHandles = SetWindowPos(hwnd, HWND_TOP, LEFT_UPPER_CORNER_X, LEFT_UPPER_CORNER_Y, LENGTH, WIDTH, 0);
  45.         if (buffForHandles == 0)
  46.         {
  47.             printErrorAndExit("SetWindowPos");
  48.         }
  49.  
  50.         if(HIDE)
  51.         {
  52.             ShowWindow(hwnd, SW_MINIMIZE);
  53.         }
  54.         return FALSE;
  55.     }
  56.     else
  57.     {
  58.         return TRUE;
  59.     }
  60. }
  61.  
  62. int main()
  63. {
  64.     int result;
  65.     /** Эта переменная будет использована позже в финальном цикле для вычисления среднего арифметического времени, затраченного на запуск одного экземпляра приложения. */
  66.     double accum;
  67.     int64_t beginTicksTiming, endTicksTiming, ticksPerSecond;
  68.     /** Массив launchRates содержит данные о каждой серии измерений для каждого приложения. */
  69.     double launchRates[NUMBER_OF_APPLICATIONS][NUMBER_OF_MEASURINGS];
  70.     char* applicationNames[NUMBER_OF_APPLICATIONS] = {
  71.         "D:\\Microsoft Office\\OFFICE11\\EXCEL.exe",
  72.         /*"D:\\Microsoft Office Excel 2003.exe"*/
  73.         /*"notepad.exe",*/
  74.         "notepad.exe"
  75.     };
  76.  
  77.  
  78.     /** Структуры типа STARTUPINFO и PROCESS_INFORMATION передаются в качестве параметров в функцию CreateProcess
  79.     * для передачи и получения информации о процессе. В данной работе структуры используются только для получения дескриптора созданного процесса.
  80.     */
  81.     STARTUPINFO startupInfo = { 0 };
  82.     startupInfo.cb = sizeof(STARTUPINFO);
  83.  
  84.     PROCESS_INFORMATION processInfo = { 0 };
  85.  
  86.     result = QueryPerformanceFrequency((LARGE_INTEGER*)&ticksPerSecond);
  87.     if (result == 0)
  88.     {
  89.         printErrorAndExit("QueryPerformanceFrequency");
  90.     }
  91.  
  92.     /** Для каждого приложения проводится серия измерений по несколько созданий-уничтожений процесса. Время выполнения серии записывается в массив. */
  93.     for (int currentApplication = 0; currentApplication < NUMBER_OF_APPLICATIONS; currentApplication++)
  94.     {
  95.         for (int currentMeasuring = 0; currentMeasuring < NUMBER_OF_MEASURINGS; currentMeasuring++)
  96.         {
  97.             launchRates[currentApplication][currentMeasuring] = 0;
  98.  
  99.             result = QueryPerformanceCounter((LARGE_INTEGER*)&beginTicksTiming);
  100.             if (result == 0)
  101.             {
  102.                 printErrorAndExit("QueryPerformanceCounter");
  103.             }
  104.  
  105.             for (int currentLaunch = 0; currentLaunch < NUMBER_OF_LAUNCHES; currentLaunch++)
  106.             {
  107.                 result = CreateProcess(0, applicationNames[currentApplication], 0, 0, 0, 0, 0, 0, &startupInfo, &processInfo);
  108.                 if (result == 0)
  109.                 {
  110.                     printErrorAndExit("CreateProcess");
  111.                 }
  112.  
  113.                 result = WaitForInputIdle(processInfo.hProcess, INFINITE);
  114.                 if (result == WAIT_FAILED)
  115.                 {
  116.                     printErrorAndExit("WaitForInputIdle");
  117.                 }
  118.  
  119.                 result = EnumWindows(enumAndResizeCallbackProc, processInfo.dwProcessId);
  120.                 if (result != ERROR)
  121.                 {
  122.                     printErrorAndExit("EnumWindows");
  123.                 }
  124.  
  125.                 Sleep(LATENCY_BEFORE_TERMINATE_IN_MS);
  126.  
  127.                 result = TerminateProcess(processInfo.hProcess, 0);
  128.                 if (result == 0)
  129.                 {
  130.                     printErrorAndExit("TerminateProcess");
  131.                 }
  132.  
  133.                 result = CloseHandle(processInfo.hThread);
  134.                 if (result == 0)
  135.                 {
  136.                     printErrorAndExit("CloseHandle");
  137.                 }
  138.             }
  139.  
  140.             result = QueryPerformanceCounter((LARGE_INTEGER*)&endTicksTiming);
  141.             if (result == 0)
  142.             {
  143.                 printErrorAndExit("QueryPerformanceCounter");
  144.             }
  145.  
  146.             /**В конце проведения каждой серии измерений записывается время, затраченное на серию. */
  147.             launchRates[currentApplication][currentMeasuring] = (endTicksTiming - beginTicksTiming) / (double)ticksPerSecond;
  148.         }
  149.     }
  150.  
  151.     /** В финальном цикле на экран выводится среднее время запуска одного экземпляра приложения для каждого приложения. */
  152.     for (int currentApplication = 0; currentApplication < NUMBER_OF_APPLICATIONS; currentApplication++)
  153.     {
  154.         accum = 0;
  155.         for (int currentMeasuring = 0; currentMeasuring < NUMBER_OF_MEASURINGS; currentMeasuring++)
  156.         {
  157.             accum += launchRates[currentApplication][currentMeasuring];
  158.         }
  159.         accum /= (NUMBER_OF_LAUNCHES * NUMBER_OF_APPLICATIONS);
  160.         accum -= (LATENCY_BEFORE_TERMINATE_IN_MS / 1000.0);
  161.         printf("%s : average time for %i cycles from %i launches (without latency) is %4.2f seconds.\n", applicationNames[currentApplication], NUMBER_OF_MEASURINGS, NUMBER_OF_LAUNCHES, accum);
  162.     }
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement