Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> обновление данных 
:(
    Опции темы
qwerty1122
Дата 4.11.2013, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 20.10.2013

Репутация: нет
Всего: нет




привет)реализую на С++ подобие диспетчера задач на Windows,вроде все хорошо,программа обновляется через определеное время если какието процессы были добавлены(/удалены) то это отображается, но вот почему то не апдейтится колонка CPU,подскажите в чем проблема.вот сам код:
Код


#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <time.h>
#include <stdlib.h>
 
using namespace std;
 
int main()
{
    for(;;){
// Делаем "снимок" процессов
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FILETIME ftCreation,
         ftExit,
         ftKernel,
         ftUser;
SYSTEMTIME stCreation,
           stExit,
           stKernel,
           stUser;
PROCESSENTRY32 pe;//хранит информацию о найденом процессе
if (Process32First(hSnapshot, &pe)) //Поиск первого процесса в снимке
  {
    printf("Name process               PID   CPU               Prioritet         PID family");
    printf("========================== ===== ================  ================  ==========");
    do  
      {
        if (!pe.th32ProcessID) continue;    // Пропуск [System process]
          HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
                                        PROCESS_VM_READ,
                                        FALSE,
                                        pe.th32ProcessID);  //Получаем дескриптор процесса
          GetProcessTimes(hProcess,&ftCreation,&ftExit,&ftKernel,&ftUser);//получаем системные времена процесса
 
          FileTimeToSystemTime(&ftCreation, &stCreation);
          FileTimeToSystemTime(&ftExit, &stExit);
          FileTimeToSystemTime(&ftUser, &stUser);
          FileTimeToSystemTime(&ftKernel, &stKernel);
           
//          cout<<"creation time   -> "<<stCreation.wHour<<" Hour "<<stCreation.wMinute<<" Min "
//              <<stCreation.wSecond<<" Sec "<<stCreation.wMilliseconds<<" mSec "<<endl; 
        int now=0,noq=0;
           now=(double)stUser.wHour*3600.0+
                  (double)stUser.wMinute*60.0+
                  (double)stUser.wSecond+
                  (double)stUser.wMilliseconds/1000.0;
           noq=(double)stKernel.wHour*3600.0+
                  (double)stKernel.wMinute*60.0+
                  (double)stKernel.wSecond+
                  (double)stKernel.wMilliseconds/1000.0;
//        cout<<"->"<<now<<"  ->"<<noq<<endl;
         int cpu=0;
           if(noq!=0)
             cpu=(now/noq);
           else
             cpu=0;
//       cout<<"->"<<cpu<<endl;
 
         char cPriority[18];
           switch (GetPriorityClass(hProcess))  //Получаем приоритет процесса
             {
               case HIGH_PRIORITY_CLASS:
                  strcpy(cPriority, "Vishe srednego");
                  break;
               case IDLE_PRIORITY_CLASS:
                  strcpy(cPriority, "Nizkii");
                  break;
               case NORMAL_PRIORITY_CLASS:
                  strcpy(cPriority, "Srednii");
                  break;
               case REALTIME_PRIORITY_CLASS:
                  strcpy(cPriority, "Realnogo vremeni");
                  break;
                default:
                  strcpy(cPriority, "Visokii");
            }
          CloseHandle(hProcess);
            //Выводим информацию о процессе
printf("%24s%6d%18d%18s%12d\n", pe.szExeFile, pe.th32ProcessID,
        cpu, cPriority, pe.th32ParentProcessID);            
        }
        while (Process32Next(hSnapshot, &pe));  //Поиск следущего процесса в снимке
    }
    else printf("Ne poluchilos' poluchit' informaciu");
        //TerminateProcess(hSnapshot, 0);
    CloseHandle(hSnapshot);
    Sleep(200);
    system("cls");
}
    system("PAUSE");
    return 0;
    getch();
}  

PM MAIL   Вверх
DarthTon
Дата 5.11.2013, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 7.2.2009

Репутация: 5
Всего: 6



Я так понимаю вы хотите получить % использования CPU процессом? Однако текущая реализация вычисляет отношение времени процесса в юзермоде к времени ядра. Если так и задумано, то не удивительно, что это отношение не изменяется.
Если всё же хотите получить % использования, то необходимо поделить сумму ftKernel и ftUser конкретного процесса на общее время все процессов. И для этого, кстати, не обязательно переводить FILETIME в SYSTEMTIME, всё равно вычисляется отношение.
PM MAIL   Вверх
qwerty1122
Дата 5.11.2013, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 20.10.2013

Репутация: нет
Всего: нет



Цитата(DarthTon @ 5.11.2013,  09:24)
Я так понимаю вы хотите получить % использования CPU процессом? Однако текущая реализация вычисляет отношение времени процесса в юзермоде к времени ядра. Если так и задумано, то не удивительно, что это отношение не изменяется.
Если всё же хотите получить % использования, то необходимо поделить сумму ftKernel и ftUser конкретного процесса на общее время все процессов. И для этого, кстати, не обязательно переводить FILETIME в SYSTEMTIME, всё равно вычисляется отношение.

подскажи пожалуйста как найти это общее всех процессов а то чтото не получается((
PM MAIL   Вверх
DarthTon
Дата 5.11.2013, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 7.2.2009

Репутация: 5
Всего: 6



Сделать предварительный проход по всем процессам и просуммировать все значения.
Код

PROCESSENTRY32 pe = { 0 };
LARGE_INTEGER totalTime = { 0 }; 
HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );

pe.dwSize = sizeof(pe);

// Iterate processes
for (BOOL result = Process32First( hSnapshot, &pe );
    hSnapshot != NULL && result == TRUE;
    result = Process32Next( hSnapshot, &pe ))
{
    HANDLE hProc = OpenProcess( PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pe.th32ProcessID );

    if(hProc != NULL)
    {
        FILETIME times[4];
        LARGE_INTEGER liUser, liKernel;

        GetProcessTimes( hProc, times, times + 1, times + 2, times + 3 );

        // User time
        liUser.LowPart  = times[3].dwLowDateTime;
        liUser.HighPart = times[3].dwHighDateTime;

        // Kernel time
        liKernel.LowPart  = times[2].dwLowDateTime;
        liKernel.HighPart = times[2].dwHighDateTime;

        // Accumulate time
        totalTime.QuadPart += liUser.QuadPart + liKernel.QuadPart;

        CloseHandle( hProc );
    }
}

PM MAIL   Вверх
qwerty1122
Дата 5.11.2013, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 20.10.2013

Репутация: нет
Всего: нет



Цитата(DarthTon @ 5.11.2013,  16:45)
Сделать предварительный проход по всем процессам и просуммировать все значения.
Код

PROCESSENTRY32 pe = { 0 };
LARGE_INTEGER totalTime = { 0 }; 
HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );

pe.dwSize = sizeof(pe);

// Iterate processes
for (BOOL result = Process32First( hSnapshot, &pe );
    hSnapshot != NULL && result == TRUE;
    result = Process32Next( hSnapshot, &pe ))
{
    HANDLE hProc = OpenProcess( PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pe.th32ProcessID );

    if(hProc != NULL)
    {
        FILETIME times[4];
        LARGE_INTEGER liUser, liKernel;

        GetProcessTimes( hProc, times, times + 1, times + 2, times + 3 );

        // User time
        liUser.LowPart  = times[3].dwLowDateTime;
        liUser.HighPart = times[3].dwHighDateTime;

        // Kernel time
        liKernel.LowPart  = times[2].dwLowDateTime;
        liKernel.HighPart = times[2].dwHighDateTime;

        // Accumulate time
        totalTime.QuadPart += liUser.QuadPart + liKernel.QuadPart;

        CloseHandle( hProc );
    }
}

чтото не выходит у меня использовать totalTime.QuadPart в вычислении(как будет правильнее впихнуть это в вычисление?и + почему то всегда в totalTime.QuadPart значение null

Это сообщение отредактировал(а) qwerty1122 - 5.11.2013, 19:18
PM MAIL   Вверх
qwerty1122
Дата 8.11.2013, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 20.10.2013

Репутация: нет
Всего: нет



попробовал твой совет,практически получилось...вот позаимствовав твой метод я попробовал также посчитать сумму Kernel и User (без накопления результата),но все равно нужного результата не выходит...подскажи где не правильно...вот код:
Код

#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <time.h>
#include <stdlib.h>

using namespace std;

int main()
{
for(;;){
    PROCESSENTRY32 pe={0};//хранит информацию о найденом процессе
LARGE_INTEGER totalTime = { 0 };
// Делаем "снимок" процессов
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
typedef union _LARGE_INTEGER {
  struct {
    DWORD LowPart;
    LONG  HighPart;
  };
  struct {
    DWORD LowPart;
    LONG  HighPart;
  } u;
  LONGLONG QuadPart;
} LARGE_INTEGER, *PLARGE_INTEGER;
FILETIME ftCreation,
         ftExit,
         ftKernel,
         ftUser;
SYSTEMTIME stCreation,
           stExit,
           stKernel,
           stUser,
           stlpIdleTime,
           stlpKernelTime,
           stlpUserTime,
           stOne;
////
bool sp1;
//BOOL WINAPI GetSystemTimes(
 FILETIME lpIdleTime;
 FILETIME lpKernelTime;
 FILETIME lpUserTime;
//);
////
pe.dwSize = sizeof(pe);
// Iterate processes
for (  BOOL result = Process32First( hSnapshot, &pe );
       hSnapshot != NULL && result == TRUE;
       result = Process32Next( hSnapshot, &pe ))
{
    HANDLE hProc = OpenProcess( PROCESS_QUERY_INFORMATION |
                                        PROCESS_VM_READ,
                                        FALSE,
                                        pe.th32ProcessID );
    if(hProc != NULL)
    {
        FILETIME times[4];
        LARGE_INTEGER liUser, liKernel;
        GetProcessTimes( hProc, times, times + 1, times + 2, times + 3 );
        // User time
        liUser.LowPart  = times[3].dwLowDateTime;
        liUser.HighPart = times[3].dwHighDateTime;
        // Kernel time
        liKernel.LowPart  = times[2].dwLowDateTime;
        liKernel.HighPart = times[2].dwHighDateTime;
        // Accumulate time
        totalTime.QuadPart += liUser.QuadPart + liKernel.QuadPart;
        //cout<<"-->>"<<totalTime.QuadPart<<endl;
        CloseHandle( hProc );
    }
}
/////////
if (Process32First(hSnapshot, &pe))    //Поиск первого процесса в снимке
  {
    //cout<<"-->>"<<totalTime.QuadPart<<endl;
    printf("Name process               PID   CPU               Prioritet         PID family");
    printf("========================== ===== ================  ================  ==========");
    do    
      {
        if (!pe.th32ProcessID) continue;    // Пропуск [System process]
          HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
                                        PROCESS_VM_READ,
                                        FALSE,
                                        pe.th32ProcessID);    //Получаем дескриптор процесса
          LARGE_INTEGER piUser, piKernel; 
          FILETIME time[4];   
          LARGE_INTEGER total= { 0 };                         
                                        
          GetProcessTimes(hProcess, time, time + 1, time + 2, time + 3);//получаем системные времена процесса
          
piUser.LowPart = time[3].dwLowDateTime;
piUser.HighPart = time[3].dwHighDateTime;
piKernel.LowPart = time[2].dwLowDateTime;
piKernel.HighPart = time[2].dwHighDateTime;
total.QuadPart = piUser.QuadPart + piKernel.QuadPart;             

//cout<<"-->>"<<totalTime.QuadPart<<endl;
LARGE_INTEGER cpu1= {0};

//cout<<"----->"<<total.QuadPart<<"->>>>"<<totalTime.QuadPart<<endl;
cpu1.QuadPart=(total.QuadPart/totalTime.QuadPart)*1000;
cout<<">>>>>>>>>"<<cpu1.QuadPart<<endl;


         char cPriority[18];
           switch (GetPriorityClass(hProcess))    //Получаем приоритет процесса
             {
               case HIGH_PRIORITY_CLASS:
                  strcpy(cPriority, "Vishe srednego");
                  break;
               case IDLE_PRIORITY_CLASS:
                  strcpy(cPriority, "Nizkii");
                  break;
               case NORMAL_PRIORITY_CLASS:
                  strcpy(cPriority, "Srednii");
                  break;
               case REALTIME_PRIORITY_CLASS:
                  strcpy(cPriority, "Realnogo vremeni");
                  break;
                default:
                  strcpy(cPriority, "Visokii");
            }
          CloseHandle(hProcess);
            //Выводим информацию о процессе
printf("%24s%6d%18d%18s%12d\n", pe.szExeFile, pe.th32ProcessID,
        cpu1.QuadPart, cPriority, pe.th32ParentProcessID);            
        }
        while (Process32Next(hSnapshot, &pe));    //Поиск следущего процесса в снимке
    }
    else printf("Ne poluchilos' poluchit' informaciu");
        //TerminateProcess(hSnapshot, 0);
    //TerminateProcess(hSnapshot,0);
    CloseHandle(hSnapshot);
    Sleep(1000);
    system("cls");
}
    system("PAUSE");
    return 0;
    getch();
}                                                                                                                                    

код черновой вариант сильно не судить за оформление
PM MAIL   Вверх
DarthTon
Дата 8.11.2013, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 7.2.2009

Репутация: 5
Всего: 6



Вместо
Код

cpu1.QuadPart=(total.QuadPart/totalTime.QuadPart)*1000;

Код

cpu1.QuadPart = (total.QuadPart * 1000 / totalTime.QuadPart);

Ну или привести к double предварительно, чтобы не бояться переполнения если нужна большая точность . Иначе всегда будет 0.
PM MAIL   Вверх
qwerty1122
Дата 8.11.2013, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 20.10.2013

Репутация: нет
Всего: нет



Цитата(DarthTon @ 8.11.2013,  16:47)
Код

cpu1.QuadPart = (total.QuadPart * 1000 / totalTime.QuadPart);


это метод делает % CPU > 100  ((
а если не 1000 делать а на 10 домножать то выводит более правдивые цифры ... НО...они не изменяются,как попали данные с первого снимка так они и крутятся

Это сообщение отредактировал(а) qwerty1122 - 8.11.2013, 19:03
PM MAIL   Вверх
DarthTon
Дата 8.11.2013, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 7.2.2009

Репутация: 5
Всего: 6



В общем я осознал что предложенный мной метод  в корне не верный smile. Он показывает % влияния каждого процесса на общее время загрузки, а не использование общего времени CPU. Подумаю ещё...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0544 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.