Author Topic: Подпрограмма работающая как прерывание  (Read 8033 times)

0 Members and 1 Guest are viewing this topic.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Небольшое отступление...
Всегда реально не хватало некоторых возможностей. О них периодически задумывался, но в предложения никогда не писал. Не хотелось грузить своими просьбами. В новой версии часть из них реализовали. Такие как:
#logfile
#autorun
DIALOGBOX
Дробный WAIT
ну и конечно массивы

Хотя последние я ожидал многомерными и с поддержкой строковых данных, что бы там Johnny не говорил про условности многомерности...

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

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

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

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

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

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

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



« Last Edit: October 17, 2013, 10:09:07 AM by Vint »


Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
о, ну это опять к вопросу о многопоточности. в принципе есть над чем подумать. нужно сохранить все базисы что имеются сейчас, чтобы никому не пришлось резко переучиваться.

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

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


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

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


print( $str[ rnd(0,2) ]  )
« Last Edit: October 17, 2013, 11:19:29 AM by Johnny »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Да вопрос как бы был не о многопоточности.
Я имел ввиду выполнение в один поток последовательно. Но Включение функции просто вместо очередного оператора вызывает подпрограмму.
Это такая полумера, хотя и очень нужная и действенная.
Многопоточность конечно ещё лучше наверно.

Мне казалось что осуществить данную возможность будет не сложно. Вот сейчас написал и понял небольшой затык с $return1, $return2... который придётся решить.


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
P.S. кто сказал что массивы не поддерживают строки?

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

 :o А я на релизе и не проверил... Сначала не работали и твой ответ был "ни к чему"  :)
Спасибо огромное


Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
кстати говоря только щас дошло почему еще мне не хочется делать многомерные массивы. их нельзя (точнее ооооочень сложно стремящееся к нельзя) сделать динамическими, поэтому многие радости вроде push, pop, arrsize и изменение размера легким взмахом руки будут недоступны. допускаю массивы из сложных составных структур но это уже совсем другая история.. делить массивы на одномерные и все остальные так же не лежит душа.

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

так вот у меня в основном явно или косвенно все просят как раз асинхронный таймер

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Странно что просят. Я имел ввиду синхронный.
Я себе слабо представляю применение асинхронного. И те, кто просят видимо тоже.
Проще вызвать другую копию кликера со своим скриптом. Кстати я так и делаю.
EXECUTE("name2.cms")

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


А для части тех задач что я говорил асинхронный даже вреден. Вызываемая подпрограмма должна же в случае чего менять последовательность выполнения основной. Как это потом делать если они будут сами по себе. :-\


Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
Странно что просят. Я имел ввиду синхронный.
Я себе слабо представляю применение асинхронного. И те, кто просят видимо тоже.
Проще вызвать другую копию кликера со своим скриптом. Кстати я так и делаю.
канонический пример. "ой а как сделать что бы каждые 6 секунд нажимался Ф1 а каждые 10 - Ф2". в принципе задача решаема введением счетчика секунд. но это нужно две переменные, два условия.
а можно завести две совершенно независимые нити. одна будет лупить Ф1, вторая Ф2.
этот пример еще можно сделать на условиях. а вот если в одной из веток нужно будет искать картинку. это же не быстро. а в другой ветке нужно по прежнему лупить четко по Ф2 без задержек всяких. тут уже только на потоках.

Quote
А для части тех задач что я говорил асинхронный даже вреден. Вызываемая подпрограмма должна же в случае чего менять последовательность выполнения основной. Как это потом делать если они будут сами по себе. :-\
ну а тут сама прелесть программирования. как хочешь так и выкручивайся, изобретай велосипед :D
правда ничего такого радикального обычно в таймеры не пихают. потому что очень сложно отслеживать логику. таймеру может приспичить выполниться в любом месте программы, особенно зная тормознутость винды.
а вот тот подход что ты сейчас делаешь, распихивая вызов подрограмм - он более нагляден и более логичен потмоу что точно известно когда вызовется подпрограмма

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
канонический пример. "ой а как сделать что бы каждые 6 секунд нажимался Ф1 а каждые 10 - Ф2".
...
Вот как раз этот вариант будет решаться без проблем с введением того, что я предложил.
В 99,9% достаточно одного регулярно вызываемого действия. Или ставят задачу неправильно.
Я представляю как он работая без кликера (вручную) совершает основные действия, левой рукой каждые 6 секунд нажимает Ф1, а правой каждые 10 - Ф2  ;D ;D ;D
Прямо Юлий Цезарь вместе с соло на клавиатуре. Или чудо-барабанщик.
« Last Edit: October 17, 2013, 04:27:43 PM by Vint »


K7321

  • Зашел в гости
  • *
  • Posts: 3
    • View Profile
Многопоточность это хорошо . Моя задача ровно через 8 часов 00сек прервать подпрограмму и выставить защиту, ну а потом продолжить поиск ништяков. Ох как нужно внешнее прерывание и его обработка.