Автор Тема: [Элементы GUI] OnEvent Mode и бесконечный цикл  (Прочитано 3537 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Krokodile [?]

  • Новичок
  • *
  • Сообщений: 43
  • Репутация: 1
    • Награды
Имеется вот такой код:
Код: AutoIt [Выделить]
#include <GUIConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>

Opt("GUIOnEventMode", 1)
Opt("GUICoordMode", 1)
GUICreate("", 500,130)

GUISetFont(92,650)
dim $label[9]
dim $k=0
$label[1]=GUICtrlCreateLabel("",10,10,50,100)
$label[2]=GUICtrlCreateLabel("",70,10,50,100)
$label[3]=GUICtrlCreateLabel("",130,10,50,100)
$label[4]=GUICtrlCreateLabel("",190,10,50,100)
$label[5]=GUICtrlCreateLabel("",250,10,50,100)
$label[6]=GUICtrlCreateLabel("",310,10,50,100)
$label[7]=GUICtrlCreateLabel("",370,10,50,100)
$label[8]=GUICtrlCreateLabel("",430,10,50,100)
;GUICtrlSetBkColor($label[1],0x666666)

GUISetFont(9,550)
$button1=GUICtrlCreateButton("Пуск/Пауза",10,100,480,20)


GUICtrlSetOnEvent($button1,"Switch1")
GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")


GUISetState ()
While 1
   sleep(100)
WEnd

Func Switch1()
   
   if $k==0 then
      $k=1
      Play()
   Else
      $k=0
      Pause()
   EndIf

EndFunc

Func Play()
   
   while 1
      GUICtrlSetData($label[8],"")
      GUICtrlSetData($label[1],"*")
      sleep(300)
      GUICtrlSetData($label[1],"")
      GUICtrlSetData($label[2],"*")
      sleep(300)
      GUICtrlSetData($label[2],"")
      GUICtrlSetData($label[3],"*")
      sleep(300)
      GUICtrlSetData($label[3],"")
      GUICtrlSetData($label[4],"*")
      sleep(300)
      GUICtrlSetData($label[4],"")
      GUICtrlSetData($label[5],"*")
      sleep(300)
      GUICtrlSetData($label[5],"")
      GUICtrlSetData($label[6],"*")
      sleep(300)
      GUICtrlSetData($label[6],"")
      GUICtrlSetData($label[7],"*")
      sleep(300)
      GUICtrlSetData($label[7],"")
      GUICtrlSetData($label[8],"*")
      sleep(300)
   WEnd
   
EndFunc

Func Pause()
   
   while 1
      sleep(300)
   Wend
   
EndFunc

;*============================================================
Func SpecialEvents()
   

    Select
        Case @GUI_CTRLID = $GUI_EVENT_CLOSE
            Exit
           
        Case @GUI_CTRLID = $GUI_EVENT_MINIMIZE
            MsgBox(0, "Window Minimized", "ID=" & @GUI_CTRLID & " WinHandle=" & @GUI_WINHANDLE)
           
        Case @GUI_CTRLID = $GUI_EVENT_RESTORE
            MsgBox(0, "Window Restored", "ID=" & @GUI_CTRLID & " WinHandle=" & @GUI_WINHANDLE)
           
    EndSelect
   
EndFunc

По нажатию на кнопку Play/Pause вызывается переключатель функций(от play к pause и наоборот). Особенность в том, что в функции Play используется бесконечный цикл. Как прерывать этот цикл в режиме MessageLoop не имею понятия, но вот что пишут в хелпе о режиме OnEvent:
Цитировать
Реакцией GUI на событие является временная остановка текущей обработки сценария (прерывание) и вызов заранее созданных функций сценария
я подумал "вот оно! этот режим может поставить на паузу все что угодно!" но не тут то было.. Видимо против бесконечного цикла не выстоит ничто(даже кнопка закрытия отказала).
Почему в функции Play не используется цикл для переключения 'звездочек'?
Потому что в изначальной(реальной) программе на его месте также стоят различные действия, не заключенные в цикл, а скрипт представленный здесь лишь упрощенный пример.

Русское сообщество AutoIt

[Элементы GUI] OnEvent Mode и бесконечный цикл
« Отправлен: Февраль 26, 2012, 23:44:44 »

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2706
  • Репутация: 1136
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Re: [Элементы GUI] OnEvent Mode и бесконечный цикл
« Ответ #1, Отправлен: Февраль 27, 2012, 06:26:49 »
Krokodile
Код: AutoIt [Выделить]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>


Opt("GUIOnEventMode", 1)
Opt("GUICoordMode", 1)
GUICreate("", 500, 130)
; GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")
GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")

GUISetFont(92, 650)
Dim $label[9]
Dim $k = 0
$label[1] = GUICtrlCreateLabel("", 10, 10, 50, 100)
$label[2] = GUICtrlCreateLabel("", 70, 10, 50, 100)
$label[3] = GUICtrlCreateLabel("", 130, 10, 50, 100)
$label[4] = GUICtrlCreateLabel("", 190, 10, 50, 100)
$label[5] = GUICtrlCreateLabel("", 250, 10, 50, 100)
$label[6] = GUICtrlCreateLabel("", 310, 10, 50, 100)
$label[7] = GUICtrlCreateLabel("", 370, 10, 50, 100)
$label[8] = GUICtrlCreateLabel("", 430, 10, 50, 100)
;GUICtrlSetBkColor($label[1],0x666666)

GUISetFont(9, 550)

$button1 = GUICtrlCreateButton("Пуск/Пауза", 10, 100, 480, 20)
GUICtrlSetOnEvent($button1, "Switch1")

GUISetState()
While 1
    Sleep(100)
WEnd

Func Switch1()

    If $k == 0 Then
        $k = 1
        Play()
    Else
        $k = 0
        Pause()
    EndIf

EndFunc

Func Play()

    While 1
        GUICtrlSetData($label[8], "")
        GUICtrlSetData($label[1], "*")
        Sleep(300)
        GUICtrlSetData($label[1], "")
        GUICtrlSetData($label[2], "*")
        Sleep(300)
        GUICtrlSetData($label[2], "")
        GUICtrlSetData($label[3], "*")
        Sleep(300)
        GUICtrlSetData($label[3], "")
        GUICtrlSetData($label[4], "*")
        Sleep(300)
        GUICtrlSetData($label[4], "")
        GUICtrlSetData($label[5], "*")
        Sleep(300)
        GUICtrlSetData($label[5], "")
        GUICtrlSetData($label[6], "*")
        Sleep(300)
        GUICtrlSetData($label[6], "")
        GUICtrlSetData($label[7], "*")
        Sleep(300)
        GUICtrlSetData($label[7], "")
        GUICtrlSetData($label[8], "*")
        Sleep(300)
    WEnd

EndFunc

Func Pause()

    While 1
        Sleep(300)
    WEnd

EndFunc

;*============================================================
Func WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $iID = BitAND($wParam, 0xFFFF)
    Switch $iID
        Case 0xF060
            Exit
        Case 0xF020
            GUISetState(@SW_MINIMIZE)
        Case 0xF030
            GUISetState(@SW_MAXIMIZE)
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc


Кстати, есть более новая справка. Там же для WM_SYSCOMMAND можно увидеть другие события.

Оффлайн Krokodile [?]

  • Новичок
  • *
  • Сообщений: 43

  • Автор темы
  • Репутация: 1
    • Награды
Re: [Элементы GUI] OnEvent Mode и бесконечный цикл
« Ответ #2, Отправлен: Февраль 27, 2012, 07:16:16 »
Цитировать
Кстати, есть более новая справка..
Спасибо.
Кстати забыл сказать самое главное - после возвращения из паузы "воспроизведение" должно начаться с того момент что и было до выхода. Если оно остановилось на третей звезде - начаться должно на четвертой.

Оффлайн Krokodile [?]

  • Новичок
  • *
  • Сообщений: 43

  • Автор темы
  • Репутация: 1
    • Награды
Re: [Элементы GUI] OnEvent Mode и бесконечный цикл
« Ответ #3, Отправлен: Февраль 27, 2012, 12:55:14 »
Вот что я имею с учетом изменений, внесенных AZJIO:
(нажмите для показа/скрытия)
По прежнему остается 2 проблемы:
1. Во время выполнения функции play(бесконечный цикл), программа не реагирует на нажатие кнопки Play/Pause. По нажатии на это кнопку, должна выполняться функция pause.
2. После выполнение функции pause(бесконечный цикл с ожиданием нажатия кнопки), программа должна вернуться в то место в цикле play, на котором она остановилась.

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

Русское сообщество AutoIt

Re: [Элементы GUI] OnEvent Mode и бесконечный цикл
« Ответ #3 Отправлен: Февраль 27, 2012, 12:55:14 »

Оффлайн C2H5OH [?]

  • Знаю я тут одно место с офигенными циркулями...
  • AutoIt Гуру
  • *****
  • Сообщений: 1473
  • Репутация: 330
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: [Элементы GUI] OnEvent Mode и бесконечный цикл
« Ответ #4, Отправлен: Февраль 27, 2012, 14:59:04 »
Код: AutoIt [Выделить]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $onAir = False, $playpoint = 0

Opt("GUIOnEventMode", 1)
Opt("GUICoordMode", 1)
GUICreate("", 500, 130)
; GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")
GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")

GUISetFont(92, 650)
Dim $n = 9
Dim $label[$n]
$label[1] = GUICtrlCreateLabel("", 10, 10, 50, 100)
$label[2] = GUICtrlCreateLabel("", 70, 10, 50, 100)
$label[3] = GUICtrlCreateLabel("", 130, 10, 50, 100)
$label[4] = GUICtrlCreateLabel("", 190, 10, 50, 100)
$label[5] = GUICtrlCreateLabel("", 250, 10, 50, 100)
$label[6] = GUICtrlCreateLabel("", 310, 10, 50, 100)
$label[7] = GUICtrlCreateLabel("", 370, 10, 50, 100)
$label[8] = GUICtrlCreateLabel("", 430, 10, 50, 100)
;GUICtrlSetBkColor($label[1],0x666666)

GUISetFont(9, 550)

$button1 = GUICtrlCreateButton("Пуск/Пауза", 10, 100, 480, 20)
GUICtrlSetOnEvent($button1, "Switch1")

GUISetState()

While 1
    $GUIMsg = GUIGetMsg()
    Switch $GUIMsg
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
    If $onAir Then Play()
WEnd


Func Switch1()

    $onAir = Not $onAir

EndFunc

Func Play()

    $playpoint += 1
    If $playpoint > 8 Then $playpoint = 1
    If $playpoint = 8 Then
        GUICtrlSetData($label[8], "")
        GUICtrlSetData($label[1], "*")
    Else
        GUICtrlSetData($label[$playpoint], "")
        GUICtrlSetData($label[$playpoint+1], "*")
    EndIf

    Sleep(300)

EndFunc

;*============================================================
Func WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $iID = BitAND($wParam, 0xFFFF)
    Switch $iID
        Case 0xF060
            Exit
        Case 0xF020
            GUISetState(@SW_MINIMIZE)
        Case 0xF030
            GUISetState(@SW_MAXIMIZE)
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc


Только с руским шрифтом что-то не то.  :-[
Рано или поздно все станет понятно, все станет на свои места и выстроится в единую красивую схему, как кружева. Станет понятно, зачем все было нужно, потому что все будет правильно.

Оффлайн Krokodile [?]

  • Новичок
  • *
  • Сообщений: 43

  • Автор темы
  • Репутация: 1
    • Награды
Re: [Элементы GUI] OnEvent Mode и бесконечный цикл
« Ответ #5, Отправлен: Февраль 27, 2012, 18:05:39 »
C2H5OH спасибо! подсказал отличный способ управления функциями. Я его немного приукрасил(усложнил). Вообщем в примере C2H5OH программа работает с одной функцией(play) но если эта функция включает в себя еще действия(5 штук), то пауза поставится только после выполнения всех 5 действий(а они могут и по 10-15 минут идти), соответсвенно после возобновления "проигрывания" заново начнется вся ФУНКЦИЯ(начиная с первого действия)
Немного усложнив программу добился более гибкого управления, которое и было моей целью!!!(см. спойлер) Теперь паузу можно ставить в момент выполнения действия, ну и возобновление конечно распространяется не только на функцию, но и на действия внутри нее..
(нажмите для показа/скрытия)

Оффлайн Robocop [?]

  • Новичок
  • *
  • Сообщений: 1
  • Репутация: 5
    • Награды
Re: [Элементы GUI] OnEvent Mode и бесконечный цикл
« Ответ #6, Отправлен: Февраль 27, 2012, 23:49:31 »
Добрый день. Как раз разбираюсь с OnEvent Mode и возможностью бесконечного цикла.
Ваш топик мне помог продвинутся, но есть явная неувязка с концепцией OnEvent.
Дело в том, что OnEvent может воспринимать только один цикл со Sleep - в главном рабочем цикле While 1 (это Я нашёл на форуме и протестировал самостоятельно). Поэтому Я взял на себя смелость подправить скрипт чтобы он был ближе с концепцией заложенной создателями AutoIt. Подробности в комментариях в скрипте :)
И непонятную функцию, которую притянули в начале обсуждения
Код: AutoIt [Выделить]
GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")

- можно выбросить.
(нажмите для показа/скрытия)

Русское сообщество AutoIt

Re: [Элементы GUI] OnEvent Mode и бесконечный цикл
« Ответ #6 Отправлен: Февраль 27, 2012, 23:49:31 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
5 Ответов
7126 Просмотров
Последний ответ Январь 07, 2012, 22:52:07
от Kaster
0 Ответов
1582 Просмотров
Последний ответ Январь 07, 2012, 19:39:49
от madmasles
5 Ответов
2769 Просмотров
Последний ответ Февраль 06, 2012, 21:03:05
от DarWiM
2 Ответов
1367 Просмотров
Последний ответ Декабрь 08, 2013, 12:09:53
от Garrett
3 Ответов
1226 Просмотров
Последний ответ Декабрь 03, 2014, 21:27:11
от BlackRock
3 Ответов
1072 Просмотров
Последний ответ Апрель 09, 2015, 09:28:41
от CrazyDoc
1 Ответов
779 Просмотров
Последний ответ Апрель 15, 2015, 20:49:23
от qqww22
6 Ответов
1395 Просмотров
Последний ответ Август 31, 2015, 14:02:22
от CreatoR
9 Ответов
1112 Просмотров
Последний ответ Сентябрь 30, 2015, 22:41:29
от InnI
40 Ответов
3775 Просмотров
Последний ответ Январь 21, 2017, 17:08:30
от VadimKHL