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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос о GetProcessTimes, Вызов после TerminateProcess 
V
    Опции темы
Dilettante
Дата 11.10.2012, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Приветствую вас! Требуется получить временные характеристики процесса после его завершения при помощи TerminateProcess. 
Код

        typedef union { LONGLONG li; FILETIME ft; } LONGFILETIME;

        STARTUPINFO                  si;
    PROCESS_INFORMATION pi;        
    _TCHAR                            notepad[]  = "notepad";
    FILETIME                          kernelTime, userTime;
    LONGFILETIME                 createTime, exitTime, elapsedTime;
    SYSTEMTIME                    sysCreateTime, sysElTime, sysKerTime, sysUserTime; 
    
        ...

        CreateProcess(NULL, notepad, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)
    
        ...

        if(TerminateProcess(pi.hProcess, 0))
                printf("Process with PID %d terminated.\n", pi.dwProcessId);
    else
                printf("Error: TerminateProcess function failed.\n");        

        if(GetProcessTimes(pi.hProcess, &createTime.ft, &exitTime.ft, &kernelTime, &userTime))
    {                
                elapsedTime.li = exitTime.li - createTime.li;
                FileTimeToSystemTime(&elapsedTime.ft, &sysElTime);
                FileTimeToSystemTime(&kernelTime, &sysKerTime);
                FileTimeToSystemTime(&userTime, &sysUserTime);

                _tprintf("Elapsed time: %02d:%02d:%02d:%03d\n", 
                            sysElTime.wHour, sysElTime.wMinute, sysElTime.wSecond, sysElTime.wMilliseconds);
                _tprintf("User time:    %02d:%02d:%02d:%03d\n", 
                            sysUserTime.wHour, sysUserTime.wMinute, sysUserTime.wSecond, sysUserTime.wMilliseconds);
                _tprintf("Kernel time:  %02d:%02d:%02d:%03d\n\n", 
                            sysKerTime.wHour, sysKerTime.wMinute, sysKerTime.wSecond, sysKerTime.wMilliseconds);            
        }
        else
                printf("Error: GetProcessTimes function failed.\n");

        ...


В результате вместо корректных значений в переменных мусор. При этом, если использовать функцию WaitForSingleObject и дожидаться закрытия вызванного блокнота, то всё нормально. После закрытия в переменных корректные значения. Подскажите, в чём тут дело?
PM MAIL   Вверх
feodorv
Дата 11.10.2012, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(Dilettante @  11.10.2012,  21:59 Найти цитируемый пост)
вместо корректных значений в переменных мусор

Прямо во всех переменных? Дело в том, что
Цитата

lpExitTime 
  [out] Pointer to a FILETIME structure that receives the exit time of the process. If the process has not exited, the content of this structure is undefined.

Поэтому в elapsedTime мусор...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Dilettante
Дата 11.10.2012, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



2feodorv, 

Нет, всё же в kernelTime и userTime нули. При этом я ещё не уточнил, что до TerminateProcess также снимаются временные характеристики процесса (передаются те же переменные). 

Получается, что GetProcessTimes не позволяет определить время существования процесса (ну то есть корректное значение exitTime), если процесс завершается с помощью TerminateProcess?
 
PM MAIL   Вверх
feodorv
Дата 11.10.2012, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(Dilettante @  11.10.2012,  22:13 Найти цитируемый пост)
Получается, что GetProcessTimes не позволяет определить время существования процесса (ну то есть корректное значение exitTime), если процесс завершается с помощью TerminateProcess?  

Бог его знает, но:
Цитата

TerminateProcess is asynchronous; it initiates termination and returns immediately. If you need to be sure the process has terminated, call the WaitForSingleObject function with a handle to the process.

TerminateProcess
Так что WaitForSingleObject всё равно нужен  smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Dilettante
Дата 12.10.2012, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Мне всё же мне удалось решить проблему с мусором, просто добавив между TerminateProcess и GetProcessTimes задержку с помощью Sleep  smile . Видимо информация о процессе не успевала обновиться. Не ожидал, что сработает, но сработало.
Хотя идея с ожиданием завершения процесса мне показалась более очевидной. 

feodorov, благодарю за ответы и внимание к теме! Проблема вроде бы исчерпана)

Это сообщение отредактировал(а) Dilettante - 12.10.2012, 20:16
PM MAIL   Вверх
feodorv
Дата 12.10.2012, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Dilettante, не за что!

Цитата(Dilettante @  12.10.2012,  21:13 Найти цитируемый пост)
добавив между TerminateProcess и GetProcessTimes задержку с помощью Sleep

А почему не воспользоваться 
Код

WaitForSingleObject( pi.hProcess, ...);

вместо Sleep()???


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Dilettante
Дата 12.10.2012, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



feodorv, да просто это лабораторная работа и так поставлено задание) Точнее, я его так понял. Вообще необходимо произвести замер временных характеристик процесса, потом ожидать нажатие клавиши (cin.get() или getch() то есть), после чего производится TerminateProcess из процесса-родителя и вновь снимаются характеристики. А WaitForSingleObject ведь, насколько я понял, конкретный интервал ожидает, или пока не завершится потомок добровольно.

Это сообщение отредактировал(а) Dilettante - 12.10.2012, 20:45
PM MAIL   Вверх
feodorv
Дата 12.10.2012, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(Dilettante @  12.10.2012,  21:43 Найти цитируемый пост)
пока не завершится потомок добровольно

Пока вообще не завершится, добровольно или принудительно, без разницы, WaitForSingleObject не разбирает. Цитирую ещё раз:
Цитата

TerminateProcess is asynchronous; it initiates termination and returns immediately. If you need to be sure the process has terminated, call the WaitForSingleObject function with a handle to the process.

То есть:
Код

TerminateProcess(...);
WaitForSingleObject(...);
GetProcessTimes(...);


Преимущества WaitForSingleObject:
  • Всегда существует вероятность, что даже после Sleep'а процесс ещё не завершился, и Вы опять получите мусор. WaitForSingleObject такую вероятность исключает.
  • Но чаще всего Вы просто будете бессмысленно ждать окончания выполнения Sleep, в то время как WaitForSingleObject уже давно бы отработал.

Уже наличие одной вероятности того, что всё может пойти не так, как задумано, должно решить вопрос в пользу WaitForSingleObject.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Dilettante
Дата 13.10.2012, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



2feodorv

Да, я не понял что вы имели ввиду в первый раз. Я думал так не получится сделать. Спасибо за подробное объяснение! Верну WaitForSingleObject на место.
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.6735 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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