1

Тема: AHK, Windows API: Вычисление момента окончания загрузки приложения

Всем добрый день!
У меня к народу такой вопрос:
Требуется программно вычислить (=узнать=засечь) момент, в который то или иное приложение полностью завершило свою загрузку в оперативную память.
Как его зафиксировать (привязать ко времени, чтобы потом использовать в скрипте) я знаю, нужно только понять, в какой момент останавливать таймер.
Скрипт пишу на Autohotkey, но также применяю DllCall для WinAPI. Соответственно, предлагайте как вам больше нравится.
В частности, для WinAPI мне предлагали использовать GetProcessTimes, но я, почитав описание, ничего не понял (т.е. не понял как эта функция может мне помочь). Но может вы поясните...
Для AHK предлагали в цикле проверять существование окна или его контрола. Но, этот способ не надёжный, поскольку есть программы, которые сначала отрисовывают окна, а уж потом догружают сами модули.

2

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Думаю, что в общем случае решения нет. У приложения может быть сколько угодно модулей, и загружаться они могут в разных комбинациях в зависимости от входящих условий. Поэтому выражение "приложение полностью завершило свою загрузку в оперативную память" весьма неопределённо.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: Indrik, 2013-03-05 19:07:38)

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

teadrinker пишет:

Поэтому выражение "приложение полностью завершило свою загрузку в оперативную память" весьма неопределённо.

Постараюсь объяснить. Все мы знаем, что тяжеловесные программы грузятся дольше лёгких. Фотошоп, например, грузится аж до 20 секунд, а Аутлук всего за 3с. Как мы это определяем? По ощущениям, так? И мы по ощущениям эту разницу чувствуем, а значит существует некий промежуток времени, свой на каждой системе для каждого приложения, в течение которого программа грузится. Из этого следует, что должен существовать некий момент, в который программа заканчивает свою загрузку (иначе мы бы не чувствовали разницы). Остаётся только этот момент программно найти.
Конечно, я допускаю, что этот момент может быть не в одну миллисекунду, а длится некоторое время, вплоть до 1 секунды это может быть, по моим наблюдениям. Но в таком случае, мне надо найти среднее арифметическое всех значений на выходе из момента загрузки, а это не сложно, это уже дело техники.
Главное – критерий. Что взять за критерий. Есть вот вариант с подсчётом загрузки процессора, но как его реализовать –ума не приложу. Мне нужен критерий, сам алгоритм.

Т.е. само "выражение" вполне определённо, а неопределено то, о чём в нём говорится.

4

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Indrik пишет:

Главное – критерий. Что взять за критерий.

Мне неизвестен критерий, по которому чётко можно было бы судить, что программа уже загрузила всё, что нужно в данных условиях, и больше ничего загружать не собирается (кроме визуального — программа начинает отзываться на действия пользователя). Что касается ориентации на среднее время загрузки — не очень удачная мысль, время загрузки приложения может отличаться в разы в зависимости от общей загруженности процессора в данный момент.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: serzh82saratov, 2013-03-05 21:18:19)

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

При загрузке процесса значение выделяемой под него памяти более\менее изменяется в сторону увеличения и когда он полностью загружен останавливается.

Может надо с какой-то периодичностью проверять это значение и при совпадении с предыдущим...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Indrik пишет:

Постараюсь объяснить. Все мы знаем, что тяжеловесные программы грузятся дольше лёгких. Фотошоп, например, грузится аж до 20 секунд, а Аутлук всего за 3с. Как мы это определяем? По ощущениям, так?

Нет. У меня нет ни "фотошопа", ни "аутлука". О том, что программа загрузилась я узнаю по наличию соответствующего окна .

Indrik пишет:

Есть вот вариант с подсчётом загрузки процессора

В любом случае плохая идея. Тогда уж расход памяти смотри.

7

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

teadrinker пишет:

кроме визуального — программа начинает отзываться на действия пользователя

Так-так, это уже кое-что. Вопрос в том – как это померить программно. Как измерить отклик? Хотя, эта идея мне не очень нравится – отклики измерять наверняка дольше, чем время выгрузки из памяти, а это значит что можно здорово потерять в точности измерений.

время загрузки приложения может отличаться в разы в зависимости от общей загруженности процессора в данный момент

Так ведь это не помеха же! Для моей задачи это неважно. Для меня главное найти этот момент в конкретном случае, а не в общем случае.

Может надо с какой-то периодичностью проверять это значение и при совпадении с предыдущим...

Да, идея. Только что будет надёжнее: через память, или через загрузку процессора?

8 (изменено: serzh82saratov, 2013-03-06 00:38:52)

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Да, идея. Только что будет надёжнее: через память, или через загрузку процессора?

А почему бы не вместе? Если процессор ещё "перегружен", то неучитывать сравнения ОП.

   Кстати можете привести пример типа:

ProcessName := "notepad.exe"
***
msgbox % "Процессс " . ProcessName . "`rиспользует  " 
         . DllCall(*** 
         . "  байт оперативной памяти"

как в AutoHotkey использовать GetProcessMemoryInfo function, а то я в Windows API ни бум-бум.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Вроде нашёл:

ProcessName := "notepad++.exe"
Process, Exist, % ProcessName

msgbox % "Процессс " . ProcessName . "`rиспользует  " 
         . GetProcessMemoryInfo( ErrorLevel )
         . "  килобайт оперативной памяти"

GetProcessMemoryInfo( PID ) 
{
   hProcess := DllCall( "OpenProcess", UInt, 0x10|0x400, Int, false, UInt, pid )
   VarSetCapacity( memCounters, 40, 0 )
   DllCall( "psapi.dll\GetProcessMemoryInfo", UInt, hProcess, UInt, &memCounters, UInt, 40 )
   DllCall( "CloseHandle", UInt, hProcess )
   Return NumGet( memCounters, 12, "UInt" ) // 1024
}

Вопрос: почему значение не совпадает со значением из диспетчером задач?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

У меня совпадает. Вы в какой колонке смотрите?

11 (изменено: serzh82saratov, 2013-03-06 09:59:05)

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Вкладка "Процессы", колонка "Память (частный рабочий набор)" - значение всегда меньше чем в скрипте.

Может потому-что: Win-7 64-bit, AutoHotkey_L Unicode 32-bit 1.1.09.03

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12 (изменено: creature.ws, 2013-03-06 10:31:16)

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Потому как «честное» значение, возвращаемое GetProcessMemoryInfo, отображается в выключенной по умолчанию колонке  «Память (рабочий набор)» "working set (memory)".

+ открыть спойлер

Скрипт для 64-битного интерпретатора отличался бы лишь размерами структуры, смещениями значений, именами типов параметров,  но не возвращаемыми данными

13

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

creature.ws
Точно, так и есть.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Частный рабочий набор включает физическую память, занятую только данным процессом. Т.е. туда не входит память, разделяемая им с другими процессами, — например, занятая под DLL, которые используются как этим процессом, так и другими.

15

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

serzh82saratov пишет:

А почему бы не вместе? Если процессор ещё "перегружен", то не учитывать сравнения ОП

Вообще, да, это сработает. Значит, если другого критерия никто не предложит, будем считать, что для данной задачи это лучший вариант.
Тогда, следующий этап: каков будет алгоритм работы с функцией GetProcessMemoryInfo?
Что берём, с чем складываем/умножаем и т.д. Там есть два входящих значения (хэндл и ещё что-то) и один исходящий. Что с ним делать, как его интерпретировать? В англоязычном описании сказано, что результат работы функции представляет собой некую структуру данных (массив или что?), но вот что с этой структурой делать, как из неё вытащить нужную информацию?
То же касается GetProcessTimes (для опроса загруженности процессора). Здесь, как я уже писал, не могу понять, чем эта функция может мне помочь.

16 (изменено: serzh82saratov, 2013-03-06 17:41:45)

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Indrik пишет:

Там есть два входящих значения (хэндл и ещё что-то)

Второе это просто место в памяти куда будет записан результат (что-то типа, я сам плохо знаю)

Indrik пишет:

Что с ним делать, как его интерпретировать? В англоязычном описании сказано, что результат работы функции представляет собой некую структуру данных (массив или что?), но вот что с этой структурой делать, как из неё вытащить нужную информацию?

Не пойму, что вы хотите сделать с готовым значением в килобайтах??

Indrik пишет:

То же касается GetProcessTimes (для опроса загруженности процессора). Здесь, как я уже писал, не могу понять, чем эта функция может мне помочь.

Я бы делал проверку например каждые 2 секунды процесса на использование оперативной памяти, если значение совпадает с предыдущим то проверяю использование этим процессом* процессора, если оно ниже к примеру 5%, то ещё через 2 секунды делаю контрольную проверку памяти, сравнивая с двумя предыдущими значениями. И после считаю что процесс загружен.

*Не знаю может ли GetProcessTimes получать значение для конкретного процесса
....

Indrik пишет:

Что с ним делать, как его интерпретировать?

Сорри, вы же про GetProcessTimes. Попозже найду как получать проценты.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17 (изменено: serzh82saratov, 2013-03-07 22:35:08)

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Украдено отсюда


#Persistent
ProcessName := "XBMC.exe"
Process, Wait, % ProcessName 
PID := ErrorLevel
SetTimer, ShowToolTip
ShowToolTip:
    ToolTip % GetProcessTimes(PID) . "`%`r" . GetProcessMemoryInfo( PID ) . " kb", 10,10
    Return
    
GetProcessTimes( PID )    { 
    Static oldKrnlTime, oldUserTime, newKrnlTime, newUserTime  
    oldKrnlTime := newKrnlTime , oldUserTime := newUserTime  
    hProc := DllCall("OpenProcess", "Uint", 0x400, "int", 0, "Uint", pid) 
    DllCall("GetProcessTimes", "Uint", hProc, "int64P", CreationTime, "int64P"
            , ExitTime, "int64P", newKrnlTime, "int64P", newUserTime)  
    DllCall("CloseHandle", "Uint", hProc) 
    Return (newKrnlTime-oldKrnlTime + newUserTime-oldUserTime)//100000 
}

GetProcessMemoryInfo( PID )   {
    hProcess := DllCall( "OpenProcess", UInt, 0x10|0x400, Int, false, UInt, pid )
    VarSetCapacity( memCounters, 40, 0 )
    DllCall( "psapi.dll\GetProcessMemoryInfo", UInt, hProcess, UInt, &memCounters, UInt, 40 )
    DllCall( "CloseHandle", UInt, hProcess )
    Return NumGet( memCounters, 12, "UInt" ) // 1024
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

18

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Пока думаю. В процессе...
Но 2с - это слишком много. 2мс ещё куда ни шло. А лучше вообеще просто сделать цикл: он будет выполняться с такой скоростью, которая обусловлена мощностью процессора машины.
Чуть позже ещё отпишусь. Пытаюсь понять последний пример и преобразовать его в понятный мне алгоритм, пока безрезультатно. Что на что и почему умножается не могу понять. Кстати, я уже видел подобные примеры на англоязычных форумах, но без объяснений, поэтому пока понять сложновато.

19

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

2мс ещё куда ни шло.

Изменение чего вы хотите увидеть за 2мс?

А лучше вообеще просто сделать цикл: он будет выполняться с такой скоростью, которая обусловлена мощностью процессора машины.

Извлекайте некий КПД мощности процессора машины, и в соответствии с ним задавайте тайминги опроса.

Что на что и почему умножается не могу понять.

Там просто извлекается потребление указанным процессом: памяти и процессорного времени. Что вы хотите умножать?

Кстати, я уже видел подобные примеры на англоязычных форумах, но без объяснений, поэтому пока понять сложновато.

Как именно GetProcessTimes и GetProcessMemoryInfo извлекают данные я тоже не понимаю, но если вы имеете значеня которые вам нужны, что именно вы хотите понять?

преобразовать его в понятный мне алгоритм

Так вы  просто словами опишите желаемый алгоритм.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

20

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

serzh82saratov пишет:

Там просто извлекается потребление указанным процессом: памяти и процессорного времени. Что вы хотите умножать?

Так там идёт всё-таки готовое значение в байтах? А в описании сказано, что там структура данных, да ещё с указателем. Вот:

MSDN пишет:

A pointer to the PROCESS_MEMORY_COUNTERS or PROCESS_MEMORY_COUNTERS_EX structure that receives information about the memory usage of the process.

А с GetProcessTimes что делать? Вот например там есть выходное значение, которое описано так:

MSDN пишет:

lpCreationTime [out]
A pointer to a FILETIME structure that receives the creation time of the process.

Creation time? Время создания? Т.е. что это? Момент во времени, в который процесс был создан, или период времени, за который он создавался? И там кстати опять идёт не значение, а указатель на структуру. Зачем такие сложности?
Дальше там говорится о user mode и kernel mode. Это о чём? Загрузка приложения в каком режиме происходит (user или kernel)?
И самое главное: как изо всего этого получить готовое значение в процентах (вот в такой то момент времени процессор был загружен на ХХ%)?

21

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Indrik пишет:

Так там идёт всё-таки готовое значение в байтах? А в описании сказано, что там структура данных, да ещё с указателем.

Всё верно. Из этой структуры скрипт читает число по смещению 12 байт, т.е. поле WorkingSetSize, и делит его на 1024, переводя байты в килобайты.

В случае использования AutoHotkey x64, смещение уже будет 16 байт и сам WorkingSetSize будет 64-битным числом.

Вроде была идея проверять значение памяти в цикле. Попробуйте её реализовать.

22

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Indrik пишет:

Creation time? Время создания? Т.е. что это? Момент во времени, в который процесс был создан, или период времени, за который он создавался?

Время создания.

Indrik пишет:

И там кстати опять идёт не значение, а указатель на структуру. Зачем такие сложности?

Это наоборот упрощение. Структуры не принято включать в другие структуры, поскольку размер структуры может со временем поменяться и поломать ещё и формат структуры, которая его содержит.

Indrik пишет:

Дальше там говорится о user mode и kernel mode. Это о чём? Загрузка приложения в каком режиме происходит (user или kernel)?

Приложение работает в пользовательском режиме, но некоторые операции в нём выполнить нельзя и тогда оно временно переключается в режим ядра. Например для операций с файлами, графикой(в том числе GUI), сетью.

Indrik пишет:

И самое главное: как изо всего этого получить готовое значение в процентах (вот в такой то момент времени процессор был загружен на ХХ%)?

Никак, для этого нужно собрать статистику по всем процессам.

23 (изменено: creature.ws, 2013-03-09 20:28:26)

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Run notepad,,, pid
ProcessWaitLoad(pid)
MsgBox блокнот запущен и перестал отъедать память

GetWorkingSetSize(ByRef processID) {
    hProcess := DllCall("OpenProcess", "UInt", 0x10|0x400, "Int", false, "UInt", processID)
    size := VarSetCapacity(memCounters, 8 + A_PtrSize * 8, 0)
    DllCall("psapi.dll\GetProcessMemoryInfo", "Ptr", hProcess, "Ptr", &memCounters, "UInt", size)
    DllCall("CloseHandle", "Ptr", hProcess)
    return NumGet(memCounters, 8 + A_PtrSize, "UInt") // 1024
}

ProcessWaitLoad(ByRef processID, waitDuration := "") {
    (waitDuration := waitDuration * 1000) && startTime := A_TickCount

    loop {
        workingSetSize := GetWorkingSetSize(processID)

        if (workingSetSize <= priorWorkingSetSize)
            return workingSetSize

        if (waitDuration && waitDuration - (A_TickCount - startTime) < 50)
            return false

        priorWorkingSetSize := workingSetSize
        Sleep 100
    }
}

24

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Как вариант.
После загрузки приложения мы видим на экране определенную картинку по ней и
делаем выводы о завершении загрузки.
Определяем ключевой цвет этой картинки - если он соответствует нужном-
приложение загружено.

Это соответствует как в реале нашим визуальным оценка загрузки приложения.

25

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Вот примерный алгоритм, который я составил для этой ситуации:
1. Сразу приложение не запускаем: берём несколько секунд на вычисление среднего значения используемой памяти, а потом уже – запускаем.
   a. В течение нескольких секунд в цикле проверяем текущее значение используемой оперативной памяти (WinAPI: GetProcessMemoryInfo), затем вычисляем среднее арифметическое (оно пригодится позже, вне основного модуля). Это значение ОЗУ1. То же делаем с загрузкой процессора (в том же цикле). Это значение ПРОЦ1. Т.е. мы получаем значения загрузки ОЗУ и ЦП в нормальном режиме (когда приложение ещё не запущено).
   b. Запускаем приложение, засекаем момент запуска (* возможно, он засекается самой системой, значение можно получить из функции GetProcessTimes ?). Сразу после запуска начинаем проверять уровень использования ОЗУ, в цикле.
2. Вычисляем момент окончания загрузки и засекаем его во времени.
   a. В цикле (без тайминга) проверяем текущее значение загрузки ОЗУ и за-поминаем предыдущее, если текущее значение равно предыдущему, или меньше его, то начинаем проверку загрузки процессора.
      i. На первом шаге цикла, пока у нас нет ср.арифм. значения, сравниваем текущее разовое значение с ПРОЦ1. Если они примерно равны (надо учесть допустимый предел колебания в несколько про-центов), то считаем, что приложение предположительно уже загрузилось, запоминаем время и даём 2с на дополнительный блок обработки ошибочного значения.
      ii. На каждом цикле проверки загрузки процессора считаем ср.арифм. этой загрузки и сравниваем со значением ПРОЦ1. Если оно совпадает (учтя допустимый предел в несколько процентов) с ПРОЦ1, то считаем, что приложение предположительно уже загрузилось, запоминаем время и даём 2с на дополнительный блок обработки ошибочного значения.
         1. Блок обработки ошибочного значения: в течение двух секунд продолжаем опрашивать процессор и память. Если загрузка процессора опять идёт вверх, или увеличивается используемая ОЗУ, то считаем остановку таймера ошибочной и возвращаемся к предыдущим блокам.
         2. Если же за эти 2с значимых изменений не происходит, то считаем ту остановку таймера правильной и идём дальше.
3. Вычитаем из момента окончания загрузки момент его начала и получаем искомое время загрузки приложения.

26

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Никак, для этого нужно собрать статистику по всем процессам.

Но тогда зачем мне эта функция? Может лучше взять GetSystemTimes?

Время создания.

Момент времени или период? Слово "время" может восприниматься и как момент, и как период.

27

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Indrik пишет:

Но 2с - это слишком много. 2мс ещё куда ни шло.


...

Кстати приведите код получающий общую загруженность процессора с помощью GetSystemTimes.

И не пойму зачем всё таки общая загрузка проца, если вас в итоге интересует конкретное приложение, а винда может грузить проц чем то другим.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

28 (изменено: Александр_, 2013-03-11 02:12:09)

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Indrik пишет:

Но тогда зачем мне эта функция?

Даже не представляю .

Indrik пишет:

Может лучше взять GetSystemTimes?

Тогда активный архиватор(или антивирус) повесит этот скрипт до конца обработки, проц всё время будет на 100%.

Indrik пишет:

Момент времени или период? Слово "время" может восприниматься и как момент, и как период.

Конечно момент.

serzh82saratov пишет:

Кстати приведите код получающий общую загруженность процессора с помощью GetSystemTimes.

(deltaKernelTime+deltaUserTime)/(deltaKernelTime+deltaUserTime+deltaIdleTime) даст процент загруженности.

29

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Александр_ пишет:

(deltaKernelTime+deltaUserTime)/(deltaKernelTime+deltaUserTime+deltaIdleTime)

Интересно. Надо это обдумать. Дельта это как я понимаю изменение на выбранном промежутке? Правда, мне нужно узнать не в промежутке, а в текущий момент, но суть одна, видимо.

Александр_ пишет:

Конечно момент.

Понял. Это очень хорошо, что Винда сама засекает момент начала - меньше проблем. Жаль, Винда не умеет засекать момент конца загрузки.
А вот с остальным вы меня всё-таки запутали. По идее, раз мне нужно узнать, в какой момент приложение загрузилось, то логично использовать GetProcessTimes (раз нас интересует процесс, то процесс мы и проверяем). С другой стороны, при помощи GetSystemTimes тоже можно узнать искомое - по общему графику изменений.
Александр, приведите пож. такой же код, как вы приводили, только для GetProcessTimes. Там ведь нет idletime.

30

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Indrik пишет:

Жаль, Винда не умеет засекать момент конца загрузки.

Нет даже такого термина "конец загрузки приложения". Когда поймёшь что это такое, тогда сам ответишь на свой вопрос. А пока эта тема служит для знакомства со счётчиками производительности windows.

Indrik пишет:

По идее, раз мне нужно узнать, в какой момент приложение загрузилось, то логично использовать GetProcessTimes

Не логично, в этой идее не учтены как минимум три важных аспекта:

  1. загруженность процессора без анализируемого приложения.

  2. количество процессоров у компьютера и потоков у приложения.

  3. наличие нескольких процессов у одного приложения(например Google Chrome).

Indrik пишет:

Александр, приведите пож. такой же код, как вы приводили, только для GetProcessTimes. Там ведь нет idletime.

IdleTime это KernelTime+UserTime процесса Idle(PID=0). Если нужна загруженность процессора одним приложением, то нужно вызвать обе функции:
(deltaProcessKernelTime+deltaProcessUserTime)/(deltaSystemKernelTime+deltaSystemUserTime+deltaSystemIdleTime)

31

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Не логично, в этой идее не учтены как минимум три важных аспекта:
загруженность процессора без анализируемого приложения.
количество процессоров у компьютера и потоков у приложения.
наличие нескольких процессов у одного приложения(например Google Chrome).

1 - для моих целей это не важно. Естественно там полно других приложений.
2 - значит нужна общая загруженность по всем ядрам и процессорам (либо только того ядра, что обрабатывает данный процесс); про потоки у приложения -- опять же, не надо усложнять - если потоков много, значит надо узнать когда загрузился последний из них
3 - да, у Хромого штук пять процессов, коли не больше, но мне, в таком случае, нужно узнать когда загрузился последний из них

Нет даже такого термина "конец загрузки приложения"

Ну значит его надо создать, и дать ему правильное определение, которое соответствовало бы реальной ситуации и учитывало бы все нюансы. И неплохо бы соответствующую функцию добавить в WinAPI.
А ваш код я не понял совершенно. Но я ещё подумаю.

32

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

А, понял код. Вы под ProcessKernelTime понимаете KernelTime, полученный при помощи функции GetProcessTimes, и аналогично с System? Тогда всё понятно.

33 (изменено: creature.ws, 2013-03-13 19:31:44)

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Вы пример из сообщения #23 попробовали использовать на реальных приложениях, «конец загрузки» которых вам хочется отловить?

34

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Indrik пишет:

Ну значит его надо создать, и дать ему правильное определение, которое соответствовало бы реальной ситуации и учитывало бы все нюансы.

Забавно, ты предлагаешь нам придумать определение термину, который сам же и ввёл? Это не к программистам, а к экстрасенсам, гадалкам и прочим "астральным сущностям".

35

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

creature.ws пишет:

Вы пример из сообщения #23 попробовали использовать на реальных приложениях, «конец загрузки» которых вам хочется отловить?

Нет пока. Я ещё на стадии планирования. К тому же, я в программе буду использовать только то, что мне совершенно понятно, а там ещё разбираться надо. Но спасибо, конечно. Как только дойдёт до практики - обязательно загляну на форум за вашим примером.
Далее. Есть всё-таки ещё один момент, который остался непонятым. Для начала, я расписал предложенные формулы понятным языком:
Загруженность процессора определяется из GetSystemTimes по следующей формуле: (deltaKernelTime+deltaUserTime)/(deltaKernelTime+deltaUserTime+deltaIdleTime), т.е. мы «общее время работы» делим на «общее время работы + время простоя», иными словами мы время работы делим на общее время.
Также, загруженность процессора одним приложением можно узнать так (при помощи двух функций: GetProcessTimes и GetSystemTimes):
(deltaProcessKernelTime+deltaProcessUserTime)/(deltaSystemKernelTime+deltaSystemUserTime+deltaSystemIdleTime), т.е. мы «общее время работы, полученное из GetProcessTimes» делим на «сумму трёх значений (общего времени работы (это 2 значения) и простоя (это ещё одно)), полученных из GetSystemTimes». Иными словами, мы общее время работы процесса делим на общее время системы.

Но тут кроется подвох. Вот, если мы возьмём к примеру, 10 секунд, как общее время, и, скажем, 3 секунды как время работы, то тут всё понятно - делим одно на другое, получаем проценты. Но мне-то нужен момент времени, а не период, а значит эти наши условные 10с превращаются в точку, как и 3с. Если и 3с и 10с являются точками, то есть нулями, то при делении вообще будет ошибка (или бесконечность, я не знаю, но в любом случае - не то что нам нужно). Как с этим быть?

Забавно, ты предлагаешь нам придумать определение термину, который сам же и ввёл?

В этом мире много забавного. Вы же тоже почему-то со мной на ты общаетесь. А ведь я вас даже не знаю - это ли не забавно? Впрочем, я не против, тем более что вы мне помогли. Ну или "ты помог".
На счёт определения - я дал идею, а дальше будь что будет. Рано или поздно всё это будет вшито в ядро, технологии не стоят на месте. Кто этим будет заниматься я не знаю, кто захочет - тот и будет.
А то у нас тут 21 век, а программисты до сих пор не придумали как осуществить нормальный удобный (в один клик или вроде того) способ, например, вставлять текст из Ворда на форум. Уже не первое десятилетие существует интернет, уже вовсю пропагандируется вэб 2.0, но мы по-прежнему вручную делаем форматирование, которое пропадает при переносе из Ворда на сайты (а если сохраняется, то очень сильно отличается от оригинала). Впрочем возможно, с появлением HTML 5 что-то изменится. Вот и про определение момента конца загрузки - та же песня.

36

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Indrik пишет:

Как с этим быть?

Сохраняем значения счётчиков при запуске приложения, далее через промежуток времени >=deltaTime снова проводим измерение и из только что полученных данных вычитаем предыдущие измерения и нормализуем их(делим на deltaTime). Это и будет искомое значение. Причём deltaTime нельзя брать очень маленьким, за подробностями в Windows Internals.

Вы же тоже почему-то со мной на ты общаетесь. А ведь я вас даже не знаю - это ли не забавно?

На этом форуме так принято. Да и вообще в интернете не чтут формальности .

Indrik пишет:

На счёт определения - я дал идею, а дальше будь что будет. Рано или поздно всё это будет вшито в ядро, технологии не стоят на месте. Кто этим будет заниматься я не знаю, кто захочет - тот и будет.

Это не серьёзно, невнятными и непроверяемыми идеями и предсказаниями интернет изобилует.

А то у нас тут 21 век, а программисты до сих пор не придумали как осуществить нормальный удобный (в один клик или вроде того) способ, например, вставлять текст из Ворда на форум. Уже не первое десятилетие существует интернет, уже вовсю пропагандируется вэб 2.0, но мы по-прежнему вручную делаем форматирование, которое пропадает при переносе из Ворда на сайты (а если сохраняется, то очень сильно отличается от оригинала). Впрочем возможно, с появлением HTML 5 что-то изменится. Вот и про определение момента конца загрузки - та же песня.

Не надо путать тёплое с мягким, Microsoft Word - это программа, а форум - это класс веб-приложений. С тем же успехом можно копировать двигатель Mitsubishi i-MiEV в стиральные машины.

37 (изменено: serzh82saratov, 2013-03-14 00:35:12)

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Indrik пишет:

А то у нас тут 21 век,

А причём тут 21 век? Или программирование и интернет появились с первого дня "нашей эры"...

Indrik пишет:

а программисты до сих пор не придумали как осуществить нормальный удобный (в один клик или вроде того) способ, например, вставлять текст из Ворда на форум.

А вы сами пробовали? Вроде как в переменной "ClipboardAll" есть всё для этого необходимое.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

38

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Спасибо всем отвечавшим! Более-менее понятно стало.

serzh82saratov пишет:

А вы сами пробовали? Вроде как в переменной "ClipboardAll" есть всё для этого необходимое.

Да я вообще не программист. Это просто хобби моё. У меня есть несколько "проектов", и я их год от года шлифую, заодно узнаю что-то новое о программировании. Чисто так, для себя, для радости.

Александр_ пишет:

Причём deltaTime нельзя брать очень маленьким, за подробностями в Windows Internals.

Где там конкретно об этом, а то книга большая... Скажем, 0,001с это нормально? А 0,01с? Меньше смысла нет, т.к. точность измерений не должна быть ниже 0,01 секунды.

39

Re: AHK, Windows API: Вычисление момента окончания загрузки приложения

Indrik пишет:

Где там конкретно об этом, а то книга большая... Скажем, 0,001с это нормально? А 0,01с? Меньше смысла нет, т.к. точность измерений не должна быть ниже 0,01 секунды.

Главы про планирование потоков. ~20 мс это размер кванта, если его не превысить, то поток будет сам постоянно нагружать процессор. Причём если система загружена, то твой код вполне может несколько секунд не получать управление.