Войти

Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 [43] 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

Creat0R
05-09-2008, 17:26
Иск,
Во-первых это очень и очень не практично в цикле вот так записывать интенсивно в ини-файл, если очеь нужно, то делать это хотябы раз в несколько (десятков) секунд.

По поводу прерывания цикла. Это можно сделать простой проверкой переменной, присваивать ей значение при запуске фуннкции:

#include <GUIConstants.au3>
#include <Misc.au3>
#include <Fade.au3>

Global $iLoopIsPaused = False

Opt("GUIOnEventMode", 1)
GUICreate("Test", 250, 200, 1024, 0)
GUISetBkColor(0xFFFFFF)
GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")
GUISetOnEvent($GUI_EVENT_MINIMIZE, "SpecialEvents")
GUISetOnEvent($GUI_EVENT_RESTORE, "SpecialEvents")
GUISetState(@SW_SHOW)

$tab = GUICtrlCreateTab(10, 10, 230, 180)

$tab2 = GUICtrlCreateTabItem("3")
GUICtrlCreateLabel("3", 30, 53, 130, 20)
$tab2combo = GUICtrlCreateCombo("", 170, 50, 60, 40)
GUICtrlSetData(-1, "40|30|20", "30") ; default 80%

$tab1 = GUICtrlCreateTabItem("2")
GUICtrlCreateLabel("2", 30, 53, 130, 20)
$tab1combo = GUICtrlCreateCombo("", 170, 50, 60, 40)
GUICtrlSetData(-1, "70|80|90", "90") ; default 80%
$MHP = GUICtrlRead($tab1combo)

$tab0 = GUICtrlCreateTabItem("1")
GUICtrlSetState(-1, $GUI_SHOW) ; will be display first
GUICtrlCreateLabel("X", 30, 53, 50, 20)
GUICtrlCreateLabel("Y", 30, 103, 50, 20)
$tab0Start = GUICtrlCreateButton("Save and Start", 10, 150, 115, 20)
GUICtrlSetOnEvent(-1, "OKPressed")
$tab0Exit = GUICtrlCreateButton("Exit", 125, 150, 115, 20)
GUICtrlSetOnEvent(-1, "CancelPressed")
$tab01input = GUICtrlCreateInput("X", 80, 50, 90, 20)
$tab02input = GUICtrlCreateInput("Y", 80, 100, 90, 20)

GUICtrlCreateTabItem("") ; end tabitem definition
GUISetState()
$Acc = IniRead(@MyDocumentsDir & "\test.ini", "Enter", "X", "")
GUICtrlSetData($tab01input, $Acc)
$Pass = IniRead(@MyDocumentsDir & "\test.ini", "Enter", "Y", "")
GUICtrlSetData($tab02input, $Pass)

While 1
Sleep(5000) ;Ждём 5 секунд
If Not $iLoopIsPaused Then Write()
WEnd

Func Write()
IniWrite(@MyDocumentsDir & "\test.ini", "Enter", "X", GUICtrlRead($tab01input))
IniWrite(@MyDocumentsDir & "\test.ini", "Enter", "Y", GUICtrlRead($tab02input))

$MHP = GUICtrlRead($tab1combo)

Switch $MHP
Case "70"
IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HP", "70")
Case "80"
IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HP", "80")
Case "90"
IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HP", "90")
EndSwitch

$MHPex = GUICtrlRead($tab2combo)

Switch $MHPex
Case "20"
IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HPex", "20")
Case "30"
IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HPex", "30")
Case "40"
IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HPex", "40")
EndSwitch
EndFunc ;==>Write

Func OKPressed()
$iLoopIsPaused = True ;Это "сообщит" циклу что функцию Write() не нужно запускать

;Тут мы выполняем что нам нужно

$iLoopIsPaused = False ;Тут мы как бы снова даём циклу "понять" что функцию Write() нужно запускать
EndFunc ;==>OKPressed

Func CancelPressed()
Exit
EndFunc ;==>CancelPressed

Func SpecialEvents()
Switch @GUI_CtrlId
Case $GUI_EVENT_CLOSE
Exit
Case $GUI_EVENT_MINIMIZE

Case $GUI_EVENT_RESTORE

EndSwitch
EndFunc ;==>SpecialEvents

Иск
05-09-2008, 17:35
Я же говорю, 2 дня как разбираюсь с этим. Все приходит с опытом, а пока метлой пытаюсь рисовать пейзажи, образно выражаясь :) Спасибо за помощь!

Maza Faka
05-09-2008, 17:37
Creat0R

Нужно в самой функции проверять (но способ ещё зависит от режима OnEvent)

Спасибо за пример.
Я для себя эту проблему решил отлавливая сообщение $WM_COMMAND, очень удобно и быстро при плотных циклах :)

Иск
05-09-2008, 17:56
Func OKPressed()
$iLoopIsPaused = True ;Это "сообщит" циклу что функцию Write() не нужно запускать ;
Тут мы выполняем что нам нужно
$iLoopIsPaused = False ;Тут мы как бы снова даём циклу "понять" что функцию Write() нужно запускать
EndFunc ;==>OKPressed »

Дело в том, что внутрь функции этой кнопки нельзя вставить основной скрипт- там тоже имеется много функций и циклов...
Есть какой-нибудь способ именно прервать выполнение цикла на запись кнопкой "старт" и перейти на основной скрипт?

ganselo
05-09-2008, 18:24
Что не так?:


#include <GUIConstantsEx.au3>
#Include <Constants.au3>

Global $Stop = False

Opt("TrayAutoPause",0)
Opt("TrayMenuMode", 1)

;Создания диалогового окна
$GUI_Main = GUICreate ( "ProcessControl 1.0", 400, 230, 45, 45, -1 )
$CTRL_btn_stt = GUICtrlCreateButton ( "Start", 20, 155, 80, 23 ) ;Кнопка Start
$CTRL_btn_stp = GUICtrlCreateButton ( "Stop", 110, 155, 80, 23 ) ;Кнопка Stop
$CTRL_btn_ext = GUICtrlCreateButton ( "Exit", 200, 155, 80, 23 ) ;Кнопка Exit
$CTRL_btr_tray = GUICtrlCreateButton ( "Minimizate", 290, 155, 80, 23) ;Кнопка Minimizate

GUICtrlCreatePic ( "resources\pic.bmp", 0, 0, 400, 72)

GUICtrlCreateLabel ( "Введите название процесса в формате *.exe, где * имя.", 30, 80, 350, -1) ;Текст

GUISetState(@SW_SHOW, $GUI_Main)

;Активация кнопки Start (функции ProcessControl)
While 1
$msg2 = GUIGetMsg(1)
Select

Case $msg2[0] = $GUI_EVENT_CLOSE
ExitLoop
Case $msg2[0] = $CTRL_btn_ext
Exit
Case $msg2[0] = $CTRL_btn_stp
$Stop = 15
Case $msg2[0] = $CTRL_btn_stt
ProcessControl()

EndSelect
WEnd

Func ProcessControl()
$i=ProcessWait("Explorer.exe")=0
Do
If $Stop = True Then
$Stop = False
ExitLoop
EndIf

$i=$i+1
ProcessWait("Explorer.exe")
ProcessClose("Explorer.exe")

$PID = ProcessExists("Explorer.exe")
If $PID Then
ProcessClose ($PID)
EndIf
until $i=1111111
EndFunc

Creat0R
05-09-2008, 18:25
Я для себя эту проблему решил отлавливая сообщение $WM_COMMAND »
Тоже вариант. Методов много, всё зависит от поставленной задачи.

Есть какой-нибудь способ именно прервать выполнение цикла на запись кнопкой "старт" и перейти на основной скрипт? »
Я этот способ привёл в примере (проверка переменной которая меняется при входе в функцию), а что значит основной скрипт?

Что не так?: »
Полагаю проблема в том что функция снова и снова запускается?
См. мой пример (http://forum.oszone.net/post-891789.html#post891789) ;).

Иск
05-09-2008, 18:35
Ну, оболочка мне нужна для того что бы выбрать переменные, а потом уже основываясь на них выполняется работа дальше. переменные эти всегда одни и те-же, меняются во вкладках. Дальше скрипт уже использует то , что я выбрал конкретно в этот раз. Помнится, в школьные годи бейсик учил, там была команда GOTO, может и тут есть что-нить похожее, что бы перенаправило по нажатию кнопки дальше. Функцию внутрь функции же нельзя вставить, а у меня там и функции, и циклы дальше идут...Просто нажать на кнопку "ок" и продолжить выполнение.

Creat0R
05-09-2008, 20:04
была команда GOTO, может и тут есть что-нить похожее »
И тут раньше оно было ;)
Сейчас вместо этого используются циклы, условия, и функции.

у меня там и функции, и циклы дальше идут »
А что мешает их поместить в главный цикл, он на то и предназначен :)

Иск
05-09-2008, 20:22
А что мешает их поместить в главный цикл, он на то и предназначен »

Мешает скудность познаний :) у меня идет скрипт так: запуск окошка, выбор переменных, запись переменных в ини, потом грузится еще одна программа и уже дальше в цикле используются данные проги и скрипта( это и есть основной скрипт). Загрузить программу до начала скрипта нельзя, если всунуть ее в кнопку "ОК", то плакал мой ноут :) Вот я и думаю как между двумя циклами вставить еще что -нибудь....

Creat0R
05-09-2008, 22:06
потом грузится еще одна программа »
Это другой скрипт?

Я если честно задрудняюсь понять проблему...
* В чём суть постоянной записи инфы в ini-файл?
* И что такое Fade.au3 в начале скрипта?

Может проще будет без режима OnEvent?
Типа такого:

#include <GUIConstants.au3>
#include <Misc.au3>
;#include <Fade.au3>

GUICreate("Test", 250, 200, 0, 0)
GUISetBkColor(0xFFFFFF)

$tab = GUICtrlCreateTab(10, 10, 230, 180)

$tab2 = GUICtrlCreateTabItem("3")
GUICtrlCreateLabel("3", 30, 53, 130, 20)
$tab2combo = GUICtrlCreateCombo("", 170, 50, 60, 40)
GUICtrlSetData(-1, "40|30|20", "30") ; default 80%

$tab1 = GUICtrlCreateTabItem("2")
GUICtrlCreateLabel("2", 30, 53, 130, 20)
$tab1combo = GUICtrlCreateCombo("", 170, 50, 60, 40)
GUICtrlSetData(-1, "70|80|90", "90") ; default 80%
$MHP = GUICtrlRead($tab1combo)

$tab0 = GUICtrlCreateTabItem("1")
GUICtrlSetState(-1, $GUI_SHOW) ; will be display first
GUICtrlCreateLabel("X", 30, 53, 50, 20)
GUICtrlCreateLabel("Y", 30, 103, 50, 20)
$tab0Start = GUICtrlCreateButton("Save and Start", 10, 150, 115, 20)
$tab0Exit = GUICtrlCreateButton("Exit", 125, 150, 115, 20)
$tab01input = GUICtrlCreateInput("X", 80, 50, 90, 20)
$tab02input = GUICtrlCreateInput("Y", 80, 100, 90, 20)

GUICtrlCreateTabItem("") ; end tabitem definition

$Acc = IniRead(@MyDocumentsDir & "\test.ini", "Enter", "X", "")
GUICtrlSetData($tab01input, $Acc)
$Pass = IniRead(@MyDocumentsDir & "\test.ini", "Enter", "Y", "")
GUICtrlSetData($tab02input, $Pass)

GUISetState(@SW_SHOW)

AdlibEnable("Write", 5000) ;Это будет запускать функцию Write() каждые 5 сек.

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $tab0Exit
Exit
Case $tab0Start
AdlibDisable() ;Отключаем временно запись данных
Opt("GUIOnEventMode", 1) ;Это чтобы события не обрабатывались

;Тут мы выполняем что нам нужно, цикл при этом не будет выполняться
;Например цикл + Запуск функции

$iCounter = 0
$iRandom = Random(0, 100, 1)

While $iCounter < 100
$iCounter += 1
ConsoleWrite($iCounter & @LF)

Sleep(100)

If $iCounter = $iRandom Then TempFunc($iCounter) ;Запуск функциии в случайном порядке :)
WEnd

AdlibEnable("Write", 5000) ;Включаем запись данных
Opt("GUIOnEventMode", 0) ;Включаем обратно обработку событии
EndSwitch
WEnd

Func Write()
IniWrite(@MyDocumentsDir & "\test.ini", "Enter", "X", GUICtrlRead($tab01input))
IniWrite(@MyDocumentsDir & "\test.ini", "Enter", "Y", GUICtrlRead($tab02input))

$MHP = GUICtrlRead($tab1combo)

Switch $MHP
Case "70"
IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HP", "70")
Case "80"
IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HP", "80")
Case "90"
IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HP", "90")
EndSwitch

$MHPex = GUICtrlRead($tab2combo)

Switch $MHPex
Case "20"
IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HPex", "20")
Case "30"
IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HPex", "30")
Case "40"
IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HPex", "40")
EndSwitch
EndFunc

Func TempFunc($iParam)
;Функция для примера
MsgBox(64, "TempFunc()", "TempFunc() Вызов функции (" & $iParam & ")")
EndFunc

Иск
06-09-2008, 05:55
Может проще будет без режима OnEvent? »

Спасибо огромное за помощь! Я по оф сайту поискал, переделал тоже без OnEvent. Ваш пример тоже сохраню, пригодится :)

Иск
06-09-2008, 22:46
У меня к вам еще вопрос...

вот функция :

func Wbd()

WinActivate("WinBDRs")

$coord = PixelSearch( 80, 361, 309, 371, 0xFF0000, 10 )
if Not @error then
$coord_1 = PixelSearch( 80, 361, 309, 371, 0x291413, 40 )
Sleep(2000)
$coord_2 = PixelSearch( 80, 361, 309, 371, 0x291413, 40 )

If $coord_1 <> $coord_2 Then

Send("i")
Else
Send("o")
EndIf

EndIf

endfunc
while 1=1
Wbd()
wend


По идее должна считывать полоску и, если она остановится, послать мне команду . Но на деле все совсем не так...она постоянно посылает команду что стоит на месте, хотя я вижу что полоска бежит. Цвета тоже правельные указал, если их отдельно проверять, все проходят. Чувствую, я с IF then намудрил...рлмогите расставить все на свои места, пожалуйста.

Creat0R
07-09-2008, 01:13
По идее должна считывать полоску »
Какую? Вообще то такие скрипты очень трудно отлаживать, я сам не любитель Pixel... функции (и подобных) :unsure: , сказать в чём проблема будет сложно, и не только мне...

Maza Faka
07-09-2008, 09:10
По идее должна считывать полоску »
А что за полоска? Progressbar?

Иск
07-09-2008, 13:59
А что за полоска? Progressbar? »

И да, и нет...Скорее полоска состояния. Сдвинулась вправо или влево -посылаем 1, стоит на месте -0 . Ну, и если нет полоски, ничего не делать, а ждать пока появится. Может через PixelChecksum как-нибудь попробовать?... В общем ушел думать :)

Еще вопрс..А можно как-нибудь организовать что бы PixelChecksum считал пиксели определенного цвета? т

Maza Faka
07-09-2008, 17:32
И да, и нет...Скорее полоска состояния. »
Что говорит AutoIt Window Info о классе этого control-а?

Иск
07-09-2008, 17:44
Он ничего сказать не может, потому что она внутри программы вшита. Говорит "WinBDRsWWindowsViewportWindow" это класс программы в общем, насколько я понял? PixelChecksum не может считывать пиксели нужного мне цвета? Можно как-нибудь посчитать их вообще автоитом?

Maza Faka
07-09-2008, 18:31
Можно как-нибудь посчитать их вообще автоитом? »
Даже и не знаю, что сказать... Я, как и Creat0R не любитель функций связанных с поиском и вычислений цветов пикселей, поищи на офф. форуме, может, что найдёшь.

Иск
07-09-2008, 18:31
Наверное я плохо объяснил и потом еще больше все запутал... в общем я решил эту проблему через пиксельсерч. По крайней мере изменения я теперь отслеживаю относительно цвета. Осталось только прописать что бы он в случае изменений делал одно, а если изменений нет- другое :) Всем спасибо за помощь. Автоит классная вещь! :)

На офф форуме там в основном только всякие боты к играм рассматриваются, пару идей я взял оттуда, но все равно пришлось по-другому все делать - у меня цвета не фиксированые были...

Maza Faka
08-09-2008, 07:42
Осталось только прописать что бы он в случае изменений делал одно, а если изменений нет- другое »

If...ElseIf...Else...EndIf




© OSzone.net 2001-2012