Автокликер Clickermann :: Форум

Основной раздел => Предложения => Topic started by: Vint on October 17, 2013, 10:01:07 AM

Title: Подпрограмма работающая как прерывание
Post by: Vint on October 17, 2013, 10:01:07 AM
Небольшое отступление...
Всегда реально не хватало некоторых возможностей. О них периодически задумывался, но в предложения никогда не писал. Не хотелось грузить своими просьбами. В новой версии часть из них реализовали. Такие как:
#logfile
#autorun
DIALOGBOX
Дробный WAIT
ну и конечно массивы
Хотя последние я ожидал многомерными и с поддержкой строковых данных, что бы там Johnny не говорил про условности многомерности...

Про компиляцию в exe (не с целью защиты) пока помолчу.

Так вот. Очень не хватает чего-то типа прерываний. В основном для стабилизации работы и исключения зацикливаний из-за помех которые невозможно учесть.
Можно сделать наподобие:
   
Code: [Select]
BREAKGOSUB(name, period)
или например
REGULARSUB(name, period)

где name - имя вызываемой подпрограммы,
period - регулярность вызова в мс
после данного оператора начинается регулярный вызов указанной подпрограммы через заданный промежуток времени.

Code: [Select]
STOPREGULARSUB(name) - этим оператором останавливать преведущую функцию.Имена условны.

В подпрограмме можно будет проверять приложение на падение или на сбой скрипта.
Или выводить счётчик/таймер параллельно работе основной программы.
Время от времени "следить" за каким нибудь второстепенным, но постоянным элементом.
Или выводить в лог номера строк скрипта (кстати не работает почему-то) для последующего анализа и отладки.
Можно ещё много применений найти.

Естественно "тяжесть" и частота вызываемой подпрограммы на совести и усмотрении создающего и в зависимости от задачи.

Просто устал распихивать GOSUB(проверка) по скрипту для отлавливания левых окон или непредвиденных ситуаций.
При этом скрипт начинает плохо читаться. Да и все нужные места не учтёшь.



Title: Re: Подпрограмма работающая как прерывание
Post by: Johnny on October 17, 2013, 11:11:00 AM
о, ну это опять к вопросу о многопоточности. в принципе есть над чем подумать. нужно сохранить все базисы что имеются сейчас, чтобы никому не пришлось резко переучиваться.

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

думаю по традиции след. обновка будет к новому году.


P.S. кто сказал что массивы не поддерживают строки?

Code: (clickermann) [Select]
$str[0] = "случайная строка"
$str[1] = "строка случайная"
$str[2] = "еще одна"


print( $str[ rnd(0,2) ]  )
Title: Re: Подпрограмма работающая как прерывание
Post by: Vint on October 17, 2013, 11:23:47 AM
Да вопрос как бы был не о многопоточности.
Я имел ввиду выполнение в один поток последовательно. Но Включение функции просто вместо очередного оператора вызывает подпрограмму.
Это такая полумера, хотя и очень нужная и действенная.
Многопоточность конечно ещё лучше наверно.

Мне казалось что осуществить данную возможность будет не сложно. Вот сейчас написал и понял небольшой затык с $return1, $return2... который придётся решить.
Title: Re: Подпрограмма работающая как прерывание
Post by: Vint on October 17, 2013, 11:26:52 AM
P.S. кто сказал что массивы не поддерживают строки?

Code: (clickermann) [Select]
$str[0] = "случайная строка"
$str[1] = "строка случайная"
$str[2] = "еще одна"
print( $str[ rnd(0,2) ]  )

 :o А я на релизе и не проверил... Сначала не работали и твой ответ был "ни к чему"  :)
Спасибо огромное
Title: Re: Подпрограмма работающая как прерывание
Post by: Johnny on October 17, 2013, 11:52:16 AM
кстати говоря только щас дошло почему еще мне не хочется делать многомерные массивы. их нельзя (точнее ооооочень сложно стремящееся к нельзя) сделать динамическими, поэтому многие радости вроде push, pop, arrsize и изменение размера легким взмахом руки будут недоступны. допускаю массивы из сложных составных структур но это уже совсем другая история.. делить массивы на одномерные и все остальные так же не лежит душа.

Quote
Да вопрос как бы был не о многопоточности.
Я имел ввиду выполнение в один поток последовательно. Но Включение функции просто вместо очередного оператора вызывает подпрограмму.
пора вводить понятия "синхронный" и "асинхронный" :D
вот когда срабатывает таймер и основной скрипт замирает, ожидая когда он отработает, это синхронный таймер (по сути обычная процедура, разве что вызывается по времени)
а вот когда срабатывает таймер и начинает делать дела параллельно основному скрипту, который не ждет пока там таймер закончит - это уже асинхронный таймер.

так вот у меня в основном явно или косвенно все просят как раз асинхронный таймер
Title: Re: Подпрограмма работающая как прерывание
Post by: Vint on October 17, 2013, 12:27:17 PM
Странно что просят. Я имел ввиду синхронный.
Я себе слабо представляю применение асинхронного. И те, кто просят видимо тоже.
Проще вызвать другую копию кликера со своим скриптом. Кстати я так и делаю.
EXECUTE("name2.cms")

Правда с "убийством" по hwnd возникли проблемы
Не работает посылка wm_close
$hwnd = wndfind("Clickermann - name2",1)
PostMessage($hwnd ,0x0010,0,0)
hwnd правильно определяет. Не закрывает даже блокнот.


А для части тех задач что я говорил асинхронный даже вреден. Вызываемая подпрограмма должна же в случае чего менять последовательность выполнения основной. Как это потом делать если они будут сами по себе. :-\
Title: Re: Подпрограмма работающая как прерывание
Post by: Johnny on October 17, 2013, 02:29:54 PM
Странно что просят. Я имел ввиду синхронный.
Я себе слабо представляю применение асинхронного. И те, кто просят видимо тоже.
Проще вызвать другую копию кликера со своим скриптом. Кстати я так и делаю.
канонический пример. "ой а как сделать что бы каждые 6 секунд нажимался Ф1 а каждые 10 - Ф2". в принципе задача решаема введением счетчика секунд. но это нужно две переменные, два условия.
а можно завести две совершенно независимые нити. одна будет лупить Ф1, вторая Ф2.
этот пример еще можно сделать на условиях. а вот если в одной из веток нужно будет искать картинку. это же не быстро. а в другой ветке нужно по прежнему лупить четко по Ф2 без задержек всяких. тут уже только на потоках.

Quote
А для части тех задач что я говорил асинхронный даже вреден. Вызываемая подпрограмма должна же в случае чего менять последовательность выполнения основной. Как это потом делать если они будут сами по себе. :-\
ну а тут сама прелесть программирования. как хочешь так и выкручивайся, изобретай велосипед :D
правда ничего такого радикального обычно в таймеры не пихают. потому что очень сложно отслеживать логику. таймеру может приспичить выполниться в любом месте программы, особенно зная тормознутость винды.
а вот тот подход что ты сейчас делаешь, распихивая вызов подрограмм - он более нагляден и более логичен потмоу что точно известно когда вызовется подпрограмма
Title: Re: Подпрограмма работающая как прерывание
Post by: Vint on October 17, 2013, 04:22:07 PM
канонический пример. "ой а как сделать что бы каждые 6 секунд нажимался Ф1 а каждые 10 - Ф2".
...
Вот как раз этот вариант будет решаться без проблем с введением того, что я предложил.
В 99,9% достаточно одного регулярно вызываемого действия. Или ставят задачу неправильно.
Я представляю как он работая без кликера (вручную) совершает основные действия, левой рукой каждые 6 секунд нажимает Ф1, а правой каждые 10 - Ф2  ;D ;D ;D
Прямо Юлий Цезарь вместе с соло на клавиатуре. Или чудо-барабанщик.
Title: Re: Подпрограмма работающая как прерывание
Post by: K7321 on July 06, 2014, 10:03:42 PM
Многопоточность это хорошо . Моя задача ровно через 8 часов 00сек прервать подпрограмму и выставить защиту, ну а потом продолжить поиск ништяков. Ох как нужно внешнее прерывание и его обработка.