1 (изменено: nullmdn, 2021-08-24 17:07:09)

Тема: AHK: Classmemory processPatternScan lower cpu usage

Привет. Я кореец. Я не говорю по-русски. Пожалуйста пойми...

Я использую около 6 функций stringToPattern (processpatternscan) на цикл. из-за этого скорость использования процессора увеличилась, поэтому я добавил sleep 10 внутри функции stringToPattern, чтобы немного снизить скорость использования процессора.

    stringToPatternSlow(string, encoding := "UTF-8", insertNullTerminator := False)
    {   
        if !length := StrLen(string)
            return -1 ; no str  
        AOBPattern := []
        encodingSize := (encoding = "utf-16" || encoding = "cp1200") ? 2 : 1
        requiredSize := StrPut(string, encoding) * encodingSize - (insertNullTerminator ? 0 : encodingSize)
        VarSetCapacity(buffer, requiredSize)
        StrPut(string, &buffer, length + (insertNullTerminator ?  1 : 0), encoding) 
        loop, % requiredSize
        {
            [b]sleep 10[/b]
            AOBPattern.Insert(NumGet(buffer, A_Index-1, "UChar"))
        }   
        return AOBPattern
    }

здесь я также добавил sleep 10 внутри processPatternScan, чтобы еще больше снизить загрузку процессора.

    processPatternScan(startAddress := 0, endAddress := "", aAOBPattern*)
    {
        address := startAddress
        if endAddress is not integer  
            endAddress := this.isTarget64bit ? (A_PtrSize = 8 ? 0x7FFFFFFFFFF : 0xFFFFFFFF) : 0x7FFFFFFF

        MEM_COMMIT := 0x1000, MEM_MAPPED := 0x40000, MEM_PRIVATE := 0x20000
        PAGE_NOACCESS := 0x01, PAGE_GUARD := 0x100
        if !patternSize := this.getNeedleFromAOBPattern(patternMask, AOBBuffer, aAOBPattern*)
            return -10  
        while address <= endAddress ; > 0x7FFFFFFF - definitely reached the end of the useful area (at least for a 32 target process)
        {
            [b]sleep 1[/b]
            if !this.VirtualQueryEx(address, aInfo)
                return -1
            if A_Index = 1
                aInfo.RegionSize -= address - aInfo.BaseAddress
            if (aInfo.State = MEM_COMMIT) 
            && !(aInfo.Protect & (PAGE_NOACCESS | PAGE_GUARD)) ; can't read these areas
            ;&& (aInfo.Type = MEM_MAPPED || aInfo.Type = MEM_PRIVATE) ;Might as well read Image sections as well
            && aInfo.RegionSize >= patternSize
            && (result := this.PatternScan(address, aInfo.RegionSize, patternMask, AOBBuffer))
            {
                if result < 0 
                    return -2
                else if (result + patternSize - 1 <= endAddress)
                    return result
                else return 0
            }
            address += aInfo.RegionSize
        }
        return 0
    }

это может значительно снизить загрузку ЦП.
однако выполнение функции занимает много времени. Это занимает 2 секунды, если в функции processpatternscan нет «сна 1», а при добавлении «сна 1» - 1 минуту.

Есть ли способ лучше?

2

Re: AHK: Classmemory processPatternScan lower cpu usage

Hi, nullmdn!
Welcome to the forum!
The language of the forum is Russian, so please edit your post using Google Translate!

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

3

Re: AHK: Classmemory processPatternScan lower cpu usage

teadrinker

okay

4

Re: AHK: Classmemory processPatternScan lower cpu usage

Попробуйте вместо Sleep, 1 использовать, например

if !mod(A_Index, 10)
   Sleep, 1
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Classmemory processPatternScan lower cpu usage

teadrinker пишет:

Попробуйте вместо Sleep, 1 использовать, например

if !mod(A_Index, 10)
   Sleep, 1

Хороший комментарий. Спасибо.