Advertisement
Guest User

Untitled

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