Что нового

[Ошибки] Код работает непомерно долго!

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Данный код выполняет сканинг и считывание текста из графики (точнее, цифр). Код работает. Но работает непомерно долго! Для сканинга участка протяженностью в 115 pix по оси "Х" уходит более 30 сек. По-моему, это слишком! Подскажите где завелся Лангольер питающийся моим временем и как его посадить на диету?!! Код сыроват... поэтому, судите строго!!!
Код:
Opt("PixelCoordMode", 2)

WinActivate("Uhodite proch, Langol'eri!!!")
WinWaitActive("Uhodite proch, Langol'eri!!!")

Dim Const $BelCol = 16777215
Dim $BCAll[12]
Dim $Deny_X, $Deny_Y
Dim $Den

$Deny_X = 115
$Deny_Y = 109

For $q = 0 To 70 Step 1
	
Dim $Beliy[12][2] = [[$Deny_X + $q, $Deny_Y], _ 
[$Beliy[0][0] + 1, $Beliy[0][1]], _
[$Beliy[0][0], $Beliy[0][1] + 1], _
[$Beliy[0][0] + 1, $Beliy[0][1] + 1], _
[$Beliy[0][0], $Beliy[0][1] + 2], _
[$Beliy[0][0] + 1, $Beliy[0][1] + 2], _
[$Beliy[0][0], $Beliy[0][1] + 3], _
[$Beliy[0][0], $Beliy[0][1] + 4], _
[$Beliy[0][0], $Beliy[0][1] + 5], _
[$Beliy[0][0], $Beliy[0][1] + 6], _
[$Beliy[0][0] + 1, $Beliy[0][1] + 6], _
[$Beliy[0][0], $Beliy[0][1] + 7]]

For $i = 0 To 11 Step 1
$BCAll[$i] = PixelGetColor($Beliy[$i][0], $Beliy[$i][1])
Next

If $BCAll[2] = $BelCol And $BCAll[3] = $BelCol And $BCAll[10] = $BelCol Then
	$Den &= 1
ElseIf $BCAll[0] = $BelCol And $BCAll[8] = $BelCol Then
	$Den &= 2
ElseIf $BCAll[0] <> $BelCol And $BCAll[1] = $BelCol And $BCAll[9] = $BelCol Then
	$Den &= 3
ElseIf $BCAll[1] = $BelCol And $BCAll[2] = $BelCol And $BCAll[3] = $BelCol Then
	$Den &= 4
ElseIf $BCAll[0] = $BelCol And $BCAll[6] = $BelCol And $BCAll[7] = $BelCol Then
	$Den &= 5
ElseIf $BCAll[5] = $BelCol And $BCAll[6] = $BelCol Then
	$Den &= 6
ElseIf $BCAll[0] = $BelCol And $BCAll[9] <> $BelCol And $BCAll[10] = $BelCol Then
	$Den &= 7
ElseIf $BCAll[1] = $BelCol And $BCAll[2] = $BelCol And $BCAll[8] = $BelCol Then
	$Den &= 8
ElseIf $BCAll[1] = $BelCol And $BCAll[2] = $BelCol And $BCAll[6] = $BelCol Then
	$Den &= 9
ElseIf $BCAll[1] = $BelCol And $BCAll[4] = $BelCol And $BCAll[6] = $BelCol And $BCAll[7] = $BelCol Then
	$Den &= 0
ElseIf $BCAll[11] >= 16770000 And $BCAll[11] <= 16773999 Or $BCAll[11] <= 16777200 And $BCAll[11] >= 16777180 Then
	$Den &= "."
EndIf
Next

MsgBox(0, "", $Den)


Спасибо! :beer:


Добавлено:
Сообщение автоматически объединено:

Может комментарии приписать?
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Проблему частично решил уменьшив время работы кода в двое. Думаю смогу уменьшить еще в 2 раза... но все-таки такая зараза эти цвета пикселов - на них оказывается все время и убивается. Хотя нагрузки на процессор ни какой. Почему эта функция так меделнно работает? Имеется в виду функция PixelGetColor и аналогичная ей PixelChecksum. Что такого в этих функциях, что из-за них все тормозякает? Хотя повторюсь, нагрузки на ресурсы ПК я вообще ни какой не увидел.
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
У меня этот код обрабатывается примерно за 20 мс
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
kzru_hunter сказал(а):
У меня этот код обрабатывается примерно за 25-70 мс
Не может быть! Значит сканинга нету. Вы окно активировали, по отношению к которому данный код применяли. А то я с этим кодом заметил еще такую странность. Если в процессе его выполнения сделать окно неактивным, то код завершается в момент с выдачей беспорядочных значений, обычно в виде единиц.
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Если закоментировать:
Код:
WinActivate("Название окна")
WinWaitActive("Название окна")
, то время выполнения около 80 мс. С активированием окна уходит около 20мс
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Хмм... странности какие-то.
Попробуйте закоментировать вот так, и проверить код вообще без окна:
Код:
Opt("PixelCoordMode", 2)

WinActivate("Uhodite proch, Langol'eri!!!")
WinWaitActive("Uhodite proch, Langol'eri!!!")
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Код:
Opt("WinWaitDelay", 10) ; Продолжительность паузы успешного ожидания в оконных функциях. Время в миллисекундах. Стандартное значение 250.
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
FlatX007 сказал(а):
Код:
Opt("WinWaitDelay", 10) ; Продолжительность паузы успешного ожидания в оконных функциях. Время в миллисекундах. Стандартное значение 250.
Не помогло :'(
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Тормозит тут, массив так никто не заполняет!

Код:
For $q = 0 To 70 Step 1
    
Dim $Beliy[12][2] = [[$Deny_X + $q, $Deny_Y], _ 
[$Beliy[0][0] + 1, $Beliy[0][1]], _
[$Beliy[0][0], $Beliy[0][1] + 1], _
[$Beliy[0][0] + 1, $Beliy[0][1] + 1], _
[$Beliy[0][0], $Beliy[0][1] + 2], _
[$Beliy[0][0] + 1, $Beliy[0][1] + 2], _
[$Beliy[0][0], $Beliy[0][1] + 3], _
[$Beliy[0][0], $Beliy[0][1] + 4], _
[$Beliy[0][0], $Beliy[0][1] + 5], _
[$Beliy[0][0], $Beliy[0][1] + 6], _
[$Beliy[0][0] + 1, $Beliy[0][1] + 6], _
[$Beliy[0][0], $Beliy[0][1] + 7]]
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Тормозит тут, массив так никто не заполняет!
Я тоже подумал об этом, поскольку так код прописал в первый раз: пробовал прописывать каждую переменную по отдельности - результат тот же. На данный момент единственно что мне реально помогло - это не построчный, а сканинг "с прыжками". С 17 сек получилось добиться 7 сек. на выполнение данного кода. Но из этих "прыжков" я уже выжал все возможное. Можно подумать над алгоритмом позиционирования сканинга и еще убрать секунду другую. Но это уже будет предел... дальше если только аптимизировать саму полоску сканинга уменьшив количество проверяемых пикселей. Больше у меня ни каких идей нету... :wacko:
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Kalisnik попробуй в коде раставить TimerInit и TimerDiff, чтобы понять где именно задержка происходит.
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
kzru_hunter сказал(а):
Kalisnik попробуй в коде раставить TimerInit и TimerDiff, чтобы понять где именно задержка происходит.
Во! Это уже что-то интересное! ))) Как это работает?
Счас покапаюсь в справке, посмотрю с чем это едят... Спасибо! :beer:


Добавлено:
Сообщение автоматически объединено:

Расставил в коде TimerInit и TimerDiff. Как и ожидалось, все время съедает вот этот отрезок:
Код:
For $i = 0 To 11 Step 1
$BCAll[$i] = PixelGetColor($Beliy[$i][0], $Beliy[$i][1])
Next

И с этим пожалуй ни чего не сделать. Всем спасибо! Тему считаю решенной.
 
Верх