Что нового

Не работает скрипт, который раньше работал

Anna

Новичок
Сообщения
119
Репутация
2
Здравствуйте. Собственно сабж.

После бэкапа системы, отказался работать, висит в трее, ошибок не выдаёт.
Возможно я что-то изменила. Подскажите, пожалуйста, что не так.
Код:
#Include <FF.au3>
#include <Constants.au3>
#include <TrayConstants.au3>
#include <UIAutomate.au3> 
#include <Date.au3>


HotKeySet('{Esc}', '_Exit')

Opt("TrayMenuMode", 1)

$Time_3 = TrayCreateItem("3 минуты", -1, -1, 1)
$Time_2 = TrayCreateItem("2 минуты", -1, -1, 1)
$Time_1 = TrayCreateItem("1 минута", -1, -1, 1)
TrayItemSetState(-1, $TRAY_CHECKED)
TrayCreateItem("")
$iExit = TrayCreateItem("Выход")

$Time_A = 1
$Time_Start = TimerInit()

While 1
    Switch TrayGetMsg()
        Case $Time_1
            $Time_A = 1
        Case $Time_2
            $Time_A = 2
        Case $Time_3
            $Time_A = 3
        Case $iExit
            Exit
    EndSwitch
    If TimerDiff($Time_Start) > ($Time_A * 60 * 1000) Then

      _test_func()
      $Time_Start = TimerInit()
    EndIf
WEnd

Func _test_func()
Opt("WinWaitDelay",100)
Opt("WinTitleMatchMode",4)
Opt("WinDetectHiddenText",1)
Opt("MouseCoordMode",0)
WinWait("Free")
If Not WinActive("Free") Then WinActivate("Free")
WinWaitActive("Free")
Send("{F5}")                 ;обновляю страницу
WinWaitActive("Free"); после обновления
Sleep(30000)                 ;пауза 30 секунд
Send("{F12}")
Sleep(10000)
Send("{CTRLDOWN}v{CTRLUP}{ENTER}") ;вставляю из буфера в консоль браузера, нажимаю enter
Sleep(5000)
Send("{F12}")
EndFunc
Func _Exit()
Exit
EndFunc
 
A

Alofa

Гость
Anna встречный вопрос: вы хотите научиться Autoit или вам нужен сразу результат?
 
Автор
A

Anna

Новичок
Сообщения
119
Репутация
2
Alofa
Учиться интереснее и легче, когда виден результат.
*****
Странное поведение скрипта, частично начал работать.
Открывает консоль, закрывает консоль, а то что должен выполнять между этими действиями, не делает.
 
A

Alofa

Гость
Учитесь анализировать скрипт и проверять ошибки.
В вашем случае, к примеру так:
Код:
#include <FF.au3>
#include <Constants.au3>
#include <TrayConstants.au3>
#include <UIAutomate.au3>
#include <Date.au3>
; Так, подключаемые библиотеки... Если "Ctri+F5" в SciTe ошибки не выдает, значит нужные все здесь.

HotKeySet('{Esc}', '_Exit') ; Если "Ctri+F5" в SciTe ошибки не выдает, значит функцию "_Exit" я создала.
; ... и почитаю ка я ище это: http://autoit-script.ru/index.php?topic=5745.0

Opt("TrayMenuMode", 1)                            ; |
                                                  ; |
$Time_3 = TrayCreateItem("3 минуты", -1, -1, 1)   ; |
$Time_2 = TrayCreateItem("2 минуты", -1, -1, 1)   ; |  Пока трей меня не интересует,
$Time_1 = TrayCreateItem("1 минута", -1, -1, 1)   ; |  но работу пунктов надо проверить,
TrayItemSetState(-1, $TRAY_CHECKED)               ; |  чуть позже.
TrayCreateItem("")                                ; |
$iExit = TrayCreateItem("Выход")                  ; |

$Time_A = 1 ; так, изначально "$Time_A" я задала значение в локальной области видимости
$Time_Start = TimerInit() ; Начальную метку времени установила

While 1 ; так, я знаю что скрипт висит, т.е. работает, а висеть он может либо в циклах либо в ожидающих функциях. Разберусь ка сначала с циклом
    
    Switch TrayGetMsg()     ; |
        Case $Time_1        ; |
            $Time_A = 1     ; |
        Case $Time_2        ; |
            $Time_A = 2     ; |
        Case $Time_3        ; |
            $Time_A = 3     ; | Надо бы проверить правильность работы "Switch..."
        Case $iExit         ; |
            Exit            ; |
    EndSwitch               ; |

MsgBox(4096, '', $Time_A) ; "MsgBox()" остановит скрипт в этом месте и покажет мне текущее значение "$Time_A"...
Sleep(5000) ; ... а для того чтобы не мешал таймер - закомментирую нижеследующие строки и поставлю вместо них "Sleep()" 5 сек.
; это все временно, потом все верну как было.
; Так, скрипт запустила, покликала по кнопкам, проверила значения переменных - все гуд. Идем дальше

; Теперь закомментирую весь блок "Switch...", а таймер наоборот разкомментирую
    If TimerDiff($Time_Start) > ($Time_A * 60 * 1000) Then
        
MsgBox(4096, '', 'Таймер сработал.'); Тоже самое: поставлю ка временно "MsgBox()" и проверю "заходит ли процесс в это условие"
; Тут все Ok
        _test_func() ; Дальше вызов функции. Пойду посмотрю что там в ней делается....
        $Time_Start = TimerInit()
    EndIf
WEnd

Func _test_func(); Так посмотрим...
    Opt("WinWaitDelay", 100)        ; | Ой какое безобразие. Моя промашка: я и забыла, что моя функция "_test_func()" вызывается в цикле. 
    Opt("WinTitleMatchMode", 4)     ; | А изменить поведение тех или иных параметров при помощи "AutoItSetOption()" достаточно один раз.
    Opt("WinDetectHiddenText", 1)   ; |
    Opt("MouseCoordMode", 0);<- а это мне вообще ни к чему
    WinWait("Free")
    
MsgBox(4096, '', 'Дождалась окно.') ; Проверю, досюда доходит процесс?
    
    If Not WinActive("Free") Then WinActivate("Free")
    WinWaitActive("Free")
    
MsgBox(4096, '', WinActive("Free")) ; ... а досюда? При этом окно активировалось?

    Send("{F5}") ;обновляю страницу
    WinWaitActive("Free")
    
MsgBox(4096, '', 'Окно обновилось???') ; ... не забываю убирать за собой "MsgBox()"

    Sleep(30000) ;пауза 30 секунд. Тааак, подумаю: а за пол минуты окно может потерять фокус??????
; Я же знаю что "Send()" РАБОТАЕТ ТОЛЬКО ПО АКТИВНОМУ ОКНУ.
; А при вызове проверочного "MsgBox()" фокус теряется? А куда он потом возвращается?
ConsoleWrite('+>' & WinActive("Free") & @LF) ; Тогда может быть так проверку устроить?

    Send("{F12}")
	
MsgBox(4096, '', 'F12 гуд ???')
WinActivate("Free") ; ... или так

    Sleep(10000) ; Опять довольно длинная пауза - Окно может потерять активность? Если Да, то следующий "Send()" не сработает
    
MsgBox(4096, 'Буфер обмена', ClipGet()) ; А в буфере то что, при этом?
WinActivate("Free") ; Это на всякий случай

    Send("{CTRLDOWN}v{CTRLUP}{ENTER}") ; Так, скрипт перестал работать после восстановления,..
; ... могла ли измениться раскладка клавиатуры по умолчанию? Я же знаю, что правильное выполнение "Send()" на прямую от неё зависит.
; попробую ка поменять "v" на русскую "м" и проверю скрипт.

    Sleep(5000)
    Send("{F12}")
    
; Выход из моей функции, а куда?
; Ах да, возвращаемся к строке "$Time_Start = TimerInit()" (сразу за вызовом моей функции)
; ... ну и т.д.
EndFunc

Func _Exit()
    Exit
EndFunc


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

OffTopic:
Anna сказал(а):
Учиться интереснее и легче, когда виден результат.
Учат нас ошибки, а не на результаты. Это я насчет "легче". :smile:



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

Там дописал комментарии.
 
Автор
A

Anna

Новичок
Сообщения
119
Репутация
2
Alofa
Спасибо, за подробные комментарии – инструкцию.
Я в тупике, всё работает, скрипт правильно работает,выполняет все действия.
Завершаю работу скрипта, запускаю вновь, не работает.
 
A

Alofa

Гость
shakehead3.gif
 
Автор
A

Anna

Новичок
Сообщения
119
Репутация
2
Это всё, раскладка!




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

Не в раскладке причина, и с английской раскладкой, то работает, то нет.
При выборе “Выход” не заканчивает работу, выходит только по Esc.
Иногда заканчивает работу при выборе “Выход”.
Висит, молча, больше 5 минут, вдруг начинает выполнять что должен.
Хотя радиокнопка выбора времени, стоит на единице.
В чём может быть причина такой нестабильной работы?
 
A

Alofa

Гость
Anna сказал(а):
... При выборе “Выход” не заканчивает работу, выходит только по Esc.
Иногда заканчивает работу при выборе “Выход”.
Anna ваш скрипт основное время своей работы проводит в цикле "While 1 ... WEnd", в котором и происходит проверка нажатия на пункты меню трея.
Также в этом же цикле происходит вызов функции "_test_func()" - с этого момента процесс выполнения скрипта попадает во "внутриности" этой функции, до ее завершения. А теперь посмотрите какое минимальное время требуется для выполнения этой функции (подсчитайте все Sleep())? Почти минута (и это без учета что скрипт вообще может застрять на одном из WinWait...). А в течении этого времени, сами понимаете, реакции на нажатие пунктов меню трея происходить не будет.
Выкрутиться из этой ситуации вы можете включив режим уведомления:
Код:
Opt('TrayOnEventMode', 1)

Но для этого вам нужно почитать, как это работает, начните Отсюда и закончите Здесь.





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

Anna вы там писали о моем чувстве юмора. Но это вполне серьезно. Лично я так и делаю при анализе: т.е. рассуждаю.
 
Автор
A

Anna

Новичок
Сообщения
119
Репутация
2
Alofa
Спасибо за ссылки, хочу обойтись без создания окна.
По времени работы не поняла, если скрипт выполнил все действия, функция "_test_func()" отработала. Сейчас что мешает завершить работу по “Выход”
 
A

Alofa

Гость
Anna сказал(а):
Alofa
Спасибо за ссылки, хочу обойтись без создания окна.
А про создание окон речь то и не идет. Для того чтобы правильно включить нужный Режим опроса событий, вам для начала нужно знать что это такое.

Anna сказал(а):
... Сейчас что мешает завершить работу по “Выход”
Ничто. Но это только если все так как вы описали. А через минуту (если $Time_A = 1) "связь" опять потеряется, как минимум на 45 сек, потом восстановится... И так по кругу.
 
Автор
A

Anna

Новичок
Сообщения
119
Репутация
2
Спасибо.
Всё оказалось гораздо проще, чем представлялось.
 
Верх