1 (изменено: asdfzxcv, 2018-03-16 17:16:48)

Тема: AHK: Проблема с if

Здравствуйте. Функция должна проверять изменялся ли файл и запускать соответствующие скрипты, но почему то иногда срабатывают сразу оба условия, иногда не срабатывает ни одно, иногда выполняется одно вместо другого. Пробовал и через if a=b/a<>b и через ifEqual/ifNotEqual - результат один. в чем может быть проблема?

+ открыть спойлер

checkTime(file)
{
FileGetTime, mainChangeTime, %file%
IniRead, mainIniTime, %file%, Time, changeTime

ifEqual, %mainChangeTime%, %mainIniTime%
{
RunWait, 1.ahk
}

ifNotEqual, %mainChangeTime%, %mainIniTime%
{
IniWrite, %mainChangeTime%, %file%, Time, changeTime
FileSetTime, %mainChangeTime%, %file%
RunWait, 2.ahk
RunWait, 3.ahk %file%
}
}

UPD: Помогли решить проблему с одновременным срабатыванием, оказалось дело было не в этом куске кода. Появилась другая проблема: при сравнении двух одинаковых дат все равно срабатывает NotEqual.

+ открыть спойлер

FileGetTime, mainChangeTime, 123.ini
IniRead, mainIniTime, 123.ini, Time, changeTime

ifNotEqual, %mainChangeTime%, %mainIniTime%
{
IniWrite, %mainChangeTime%, 123.ini, Time, changeTime
FileSetTime, %mainChangeTime%, 123.ini
MsgBox, "%mainChangeTime%"  not equal   "%mainIniTime%"
}

ifEqual, %mainChangeTime%, %mainIniTime%
{
MsgBox, "%mainChangeTime%"   equal   "%mainIniTime%"
}

https://imgur.com/a/WXVnS

UPD2: Поменял Euqal/NotEqual местами и все заработало как надо. Но почему ifEqual возвращает false при равенстве? Или все делается правильно, просто я чего-то не понимаю? Буду благодарен если кто-то объяснит.

И еще вопрос: возможно ли закрыть разом все запущенные потоки ahk?

2

Re: AHK: Проблема с if

Файлом, который Вы проверяете, является INI файл, в который записываются изменения о его изменении...
Если Вы его изменяете, то Вам должно быть известно, что изменения произошли с вероятностью, близкой к абсолютной. Если это так, то какой смысл в этой функции? К тому же, если INI-файл был изменён из другого места и условие для "ifNotEqual" возвращает TRUE, то происходит запись об этом в INI-файл и изменяется его время модификации на предыдущее, что на следующем вызове функции создаст это же состояние условия для "ifNotEqual".

Вы уверены, что именно этого пытаетесь добиться?

3

Re: AHK: Проблема с if

KusochekDobra пишет:

К тому же, если INI-файл был изменён из другого места и условие для "ifNotEqual" возвращает TRUE, то происходит запись об этом в INI-файл и изменяется его время модификации на предыдущее, что на следующем вызове функции создаст это же состояние условия для "ifNotEqual".

Вы уверены, что именно этого пытаетесь добиться?


IniWrite, %mainChangeTime%, %file%, Time, changeTime
FileSetTime, %mainChangeTime%, %file%

В первой строке новая дата изменения пишется в файл, соответственно меняя его, вторая строка меняет время изменения файла на то, которое было в него записано. С правильными датами проблем точно нет.

4

Re: AHK: Проблема с if

Верно, но для чего?

5

Re: AHK: Проблема с if

Что бы изменения в программу вносились автоматически при изменения ключей в ini файле.

6 (изменено: KusochekDobra, 2018-03-16 17:34:19)

Re: AHK: Проблема с if

Для этого достаточно читать содержимое этих ключей и если они изменились, совершать действия.

По поводу "IfEqual", возможно, что "FileGetTime" и "IniRead", возвращают разный тип, например, числовой и строковый, тогда это будут разные значения.

UPD
Если вопрос в том, чтобы читать INI только в том случае, если в него была произведена запись, то в этой теме рассматриваются способы наблюдения за изменениями в папке, к событиям которых можно прицепить код. Довольно гибкое решение.

7 (изменено: asdfzxcv, 2018-03-16 17:59:31)

Re: AHK: Проблема с if

В моем случае ключей около 100 и проще проверить дату изменения файла.
Возможно есть способ проверить тип переменной? Все таки все работает если условия поменять местами.

UPD: Сделал обе переменные числами - все по прежнему:

+ открыть спойлер

change := mainChangeTime*1
ini := mainIniTime*1

if %ini%<>%change%
{
MsgBox, "%change%"  not equal   "%ini%"
}

if %ini%=%change%
{
MsgBox, "%change%"   equal   "%ini%"
}

Даже если напрямую задать им одинаковые значения возвращается false xD Видимо я и правда не понимаю чего-то.

+ открыть спойлер

change := 2
ini := 2

ifNotEqual, %ini%, %change%
{
MsgBox, "%change%"  not equal   "%ini%"
}

ifEqual, %ini%, %change%
{
MsgBox, "%change%"   equal   "%ini%"
}

8

Re: AHK: Проблема с if

Тогда храните время изменения файла в сценарии, который оперирует этой функцией и просто читайте в цикле время изменения, выходя из него всякий раз, когда оно изменяется:


FileGetTime, fileTime, 123.ini
Loop {
	Loop {
		FileGetTime, changeTime, 123.ini
		if (fileTime != changeTime) {
			fileTime := changeTime
			break
		}
		Sleep, 250
	}
	; INI-файл изменился. Выполнить инструкции и вернуться к ожиданию изменений
}

И вместо устаревших "IfEqual", используйте просто "if":


var1 := 123
var2 := "123"

ifEqual, %var1%, %var2%
	MsgBox,% var1 " эквивалентна " var2
else
	MsgBox,% var1 " не эквивалентна " var2
	
if (var1 == var2)
	MsgBox,% var1 " эквивалентна " var2
else
	MsgBox,% var1 " не эквивалентна " var2

9 (изменено: asdfzxcv, 2018-03-16 18:05:05)

Re: AHK: Проблема с if

Похоже проблема у меня. Оба кода выдают неравенство.
Буду искать, в любом случае спасибо.

10 (изменено: KusochekDobra, 2018-03-16 18:20:22)

Re: AHK: Проблема с if

IfEqual.
Вы неправильно делаете запись. Первой передаётся имя переменной, без процентов, второй передаётся строка, число, или ссылка на переменную в виде %var%. Я кстати тоже следую этому заблуждению. Прошу прощения.

Лучше всё-таки пользоваться просто "if", он работает как с переменными, так и с любыми типами, автоматически приводятся к строке и сравнивая по алфавиту.

UPD
И не прячьте пожалуйста свой код под спойлер. Вы ничего секретного не выдаёте и это не удобно для восприятия.