1 (изменено: belyankin12, 2017-02-01 00:01:46)

Тема: AHK: Проблемы с циклом Loop

Здравствуйте, у меня есть скрипт-биндер для игры. В него я подключаю через инклуд те скрипты, которые должны постоянно работать. Цикл создаю с помощью Loop. Перестало все работать с момента смены UDF для скрипта, но почему-то мне кажется, что не в нем проблема. Суть такова: через Loop скрипт не выполняется, даже если поставить Loop 10000 например, а если поставить клавишу активации, все идёт. Вот код:


#UseHook
#NoEnv
#SingleInstance force
#IfWinActive GTA:SA:MP
#include %A_ScriptDir%\plugins\SAMP-UDF-Developer.ahk

Loop 
{
    Fileread, ans_mac, %afkmode%
    log := {str:"",find:0,num:0}    ,    log.str := []
    FileEncoding, CP0
    Loop, read, %path_log%
    log.str.Insert(A_LoopReadLine)    ,log.num := A_Index
	
    loop 5
    if RegExMatch(     log.str[log.num + 1 - A_Index]
        ,"\[(.*)\]  SMS:(.*). Отправитель: (.*)_(.*)\[(.*)\]"
        , end_str) and (log.find:=log.num + 1 - A_Index)
            break
    sleep 500
	
	if (end_str5 != "") and  (ans_mac = "On") {
	    sendinput {f6}/t %end_str5% Я сейчас АФК, за меня ответил тебе биндер{enter}
		sleep 300
		showDialog("0", "{FF8300}Пропущенное сообщение", "{FFFAFA}От кого: {9ACD32}" . end_str3 . "_" . end_str4 . "[" . end_str5 . "]`n{FFFAFA}Текст: {33CCFF}" . end_str2 . "", "OK")
		sleep 1100
	}
		
}
return

Чтобы он работал, я прописываю в коде основного скрипта следующее:

#include %A_ScriptDir%\plugins\AutoSMS.ahk

В чем может быть проблема? Неужели UDF способен погасить Loop каким-то образом? Если понадобится, могу его приложить.

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

2

Re: AHK: Проблемы с циклом Loop

Зачем тебе путь указывать к файлу #include ?
Кинь его рядом со своим скриптом и сделай так:

#include SAMP-UDF-Developer.ahk

3

Re: AHK: Проблемы с циклом Loop

Тогда у меня будет проблем много, у меня не один такой скрипт, что я подключаю. Вот и формирую все по папочкам. А в этом скрипте не выйдет прописать инклуд в корень, потому что за основу берется A_ScriptDir не этого скрипта, а основного.

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

4

Re: AHK: Проблемы с циклом Loop

Модератор, что перенес мою тему. Вопрос: если в теме используется слово "игра", то это уже сразу нужно создавать в теме для игры? Или может если я указываю проблему не конкретно игры, а чистого кода. Т.е. я мог бы даже не использовать слово "Игра", все равно бы выразил суть проблемы...

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

5

Re: AHK: Проблемы с циклом Loop

Да, слово "игра". А ещё  "с момента смены UDF" и GTA:SA:MP.
То есть тема обращена к игровой аудитории. Кто эту игру не знает, тому не понятно о чём речь.

Если трудности с командой Include, почитайте справку, потренируйтесь на простом примере. Если и после этого не понятно, тогда выложите код с этим простым примером, плюс содержимое include-файла.

6 (изменено: belyankin12, 2017-01-31 22:49:09)

Re: AHK: Проблемы с циклом Loop

Не понимаю о каких трудностях вы говорите. Этот же код работал на ура в предыдущей версии скрипта. Сменив UDF я получил моментальное отключение всех инклудов, которые работают в цикле loop. Инклуды, что активируются клавишей, работают как раньше. Только loop грешит. Вот сейчас сделал простейшие коды: основной скрипт записывает в текстовый файл цифру один, а если там цифра один, то удаляет текстовый файл и записывает цифру ноль. Второй скрипт инклудом подключен к первому и если в файле цифра один, он мне флудит командой msgbox. Все работает. Подключаю UDF - тоже работает. Почему код из первого поста не работает, не понятно...

Вот первый файл:


SetWorkingDir %A_ScriptDir%
#Include 2.ahk
#include D:\Обитель Белки\AHK\Биндер\Plugins\SAMP-UDF-Developer.ahk

!1::
msgbox, Work
return

!2::
FileRead, var, 2.txt
if (var = "qqq=1") {
FileDelete, 2.txt
FileAppend, qqq=0, 2.txt
} else {
FileDelete, 2.txt
FileAppend, qqq=1, 2.txt
}
return

Вот второй


#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

Loop 
{
    log := {str:"",find:0,num:0}    ,    log.str := []
    FileEncoding, CP0
    Loop, read, 2.txt
    log.str.Insert(A_LoopReadLine)    ,log.num := A_Index
	
    loop 5
    if RegExMatch(     log.str[log.num + 1 - A_Index]
        ,"qqq=(.*)"
        , var) and (log.find:=log.num + 1 - A_Index)
            break
    sleep 500

if (var1 = 1) {
msgbox, %var%
sleep 1100
}
}

Как я и предполагал, проблема не в UDF. Так в чем же тогда? Ещё раз повторюсь, что приведенный в первом посте код работает прекрасно через клавишу активации. Примерно так оно выглядит:

f2::
#include file
return

Но только стоит убрать клавишу активации, а в дополнительном скрипте поставить Loop как все перестает работать...

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

7

Re: AHK: Проблемы с циклом Loop

belyankin12, всё равно не пойму, что Вы хотите. Я не знаю что за предыдущая версия скрипта, давайте ещё более простой пример. Где основной скрипт? Где include-файл? Что именно должно быть, и как получается на самом деле?

8

Re: AHK: Проблемы с циклом Loop

Выложу основной скрипт в виде файла, а не кода, потому что тут больше тысячи строчек, раз вам не хватает только части основного скрипта. Инклуд в первом посте, именно его я подключаю. Должно быть следующее: подключенный через include скрипт должен постоянно читать текстовый файл на наличие определенного шаблона (RegExMatch). Как только он находит строку по шаблону, он проверяет параметр, что задан в другом текстовом файле. Если параметр = 1, то скрипт выполняет действие, если параметр отличный от 1, то скрипт ничего не делает. И опять повторюсь. Что все работает абсолютно, если с кода, что в первом посте убрать Loop и поставить клавишу активации. Т.е. в ручном режиме все работает, а в автоматическом не хочет.

Post's attachments

Samp binds - мои.ahk 101.63 kb, 2 downloads since 2017-01-31 

You don't have the permssions to download the attachments of this post.
Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

9

Re: AHK: Проблемы с циклом Loop

ypppu пишет:

Где include-файл?

Это секрет посвящённых.
Так как я к ним не принадлежу, могу предположить.




#UseHook
#NoEnv
#SingleInstance force

Loop 
{
    Fileread, ans_mac, %afkmode%
    log := {str:"",find:0,num:0}    ,    log.str := []
    FileEncoding, CP0
    Loop, read, %path_log%
    log.str.Insert(A_LoopReadLine)    ,log.num := A_Index
	
    loop 5
    if RegExMatch(     log.str[log.num + 1 - A_Index]
        ,"\[(.*)\]  SMS:(.*). Отправитель: (.*)_(.*)\[(.*)\]"
        , end_str) and (log.find:=log.num + 1 - A_Index)
            break
    sleep 500
	
	if (end_str5 != "") and  (ans_mac = "On") {
	    sendinput {f6}/t %end_str5% Я сейчас АФК, за меня ответил тебе биндер{enter}
		sleep 300
		showDialog("0", "{FF8300}Пропущенное сообщение", "{FFFAFA}От кого: {9ACD32}" . end_str3 . "_" . end_str4 . "[" . end_str5 . "]`n{FFFAFA}Текст: {33CCFF}" . end_str2 . "", "OK")
		sleep 1100
	}
		
}
return

#include %A_ScriptDir%\plugins\SAMP-UDF-Developer.ahk
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Проблемы с циклом Loop

Вероятно один из #include содержит бесконечный цикл. Пока он не закончится, не подключится следующий #include. А горячая клавиша умеет прерывать текущий "поток".

semechka пишет:

Несмотря на то, что AutoHotkey фактически не использует множественные потоки, она моделирует это поведение: если начать второй поток - например, нажимая очередную горячую клавишу, пока предыдущая еще работает - текущий поток будет прерван (временно остановлен), что позволит новому потоку стать текущим. Если начать третий поток, когда второй еще работает, то и второй и первый потоки окажутся в неактивном состоянии, и так далее.

11

Re: AHK: Проблемы с циклом Loop

Вот оно что... И вправду, подключаю к простому скрипту сначала инклудом udf а потом уже скрипт с loop и скрипт не работает... Теперь дело за малым, найти бесконечный цикл. Спасибо всем.

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

12

Re: AHK: Проблемы с циклом Loop

Очень просто.


#NoEnv
#SingleInstance force
SetTimer, autobind, on

autobind:
{
    Fileread, ans_mac, %afkmode%
    log := {str:"",find:0,num:0}    ,    log.str := []
    FileEncoding, CP0
    Loop, read, %path_log%
    log.str.Insert(A_LoopReadLine)    ,log.num := A_Index
	
    loop 5
    if RegExMatch(     log.str[log.num + 1 - A_Index]
        ,"\[(.*)\]  SMS:(.*). Отправитель: (.*)_(.*)\[(.*)\]"
        , end_str) and (log.find:=log.num + 1 - A_Index)
            break
    sleep 500
	
	if (end_str5 != "") and  (ans_mac = "On") {
	    sendinput {f6}/t %end_str5% Я сейчас АФК, за меня ответил тебе биндер{enter}
		sleep 300
		showDialog("0", "{FF8300}Пропущенное сообщение", "{FFFAFA}От кого: {9ACD32}" . end_str3 . "_" . end_str4 . "[" . end_str5 . "]`n{FFFAFA}Текст: {33CCFF}" . end_str2 . "", "OK")
		sleep 1100
	}
		
}
return

#include %A_ScriptDir%\plugins\SAMP-UDF-Developer.ahk

Loop тут вовсе не нужен. Попробуй так, потом отпишись.

13

Re: AHK: Проблемы с циклом Loop

slavafedora, Один раз отработал скрипт. Мне уже помощь не нужна, я нашел причину в своем UDF и просто перенес ту часть скрипта в конец кода.

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