Что нового

[Элементы GUI] Пауза скрипта и продолжение с места остановки.

Nelsy

Знающий
Сообщения
35
Репутация
8
Как организовать паузу скрипта кнопкой в GUI, и его продолжение с места выполняемой инструкции в момент паузы.

Почему на отрез отказывается работать такой вариант:
Код:
#include "GUIConstants.au3"

Opt('MustDeclareVars', 1)
Opt("GUIOnEventMode", 1)

Global $mainwindow = GUICreate("Monitoring", 200, 200)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
Global $Pausebutton = GUICtrlCreateButton("Pause", 50, 5)
GUICtrlSetOnEvent($Pausebutton, "_Pause")
GUISetState(@SW_SHOW)

Global $Paused

While 1
  Sleep(1000)
WEnd

Func _Pause()
	$Paused = Not $Paused
    While $Paused
        Sleep(100)
        ToolTip('Script is "Paused"',0,0)
    WEnd
    ToolTip("")
EndFunc

Func _Exit()
	Exit
EndFunc
При первом нажатии кнопки паузы скрипт благополучно прерывается но при повторном ничего не происходит.

А в этом примере все работает на ура(без гуй, при помощи хоткей):
Код:
Opt('MustDeclareVars', 1)

HotKeySet("{PAUSE}", "_Pause")
HotKeySet("^{PAUSE}", "_Exit")

Global $Paused

While 1
  MsgBox(0,0,"1",2)
  MsgBox(0,0,"2",2)
  MsgBox(0,0,"3",2)
  _testAx()
  MsgBox(0,0,"4",2)
  MsgBox(0,0,"5",2)
WEnd

Func _Pause()
	$Paused = Not $Paused
    While $Paused
        Sleep(100)
        ToolTip('Script is "Paused"',0,0)
    WEnd
    ToolTip("")
EndFunc

Func _Exit()
	Exit
EndFunc

Func _testAx()
  MsgBox(0,0,"a1",2)
  MsgBox(0,0,"a2",2)
  MsgBox(0,0,"a3",2)
  _testBx()
  MsgBox(0,0,"a4",2)
  MsgBox(0,0,"a5",2)
EndFunc

Func _testBx()
  MsgBox(0,0,"b1",2)
  MsgBox(0,0,"b2",2)
  MsgBox(0,0,"b3",2)
  _testCx()
  MsgBox(0,0,"b4",2)
  MsgBox(0,0,"b5",2)
EndFunc

Func _testCx()
  MsgBox(0,0,"c1",2)
  MsgBox(0,0,"c2",2)
  MsgBox(0,0,"c3",2)
  MsgBox(0,0,"c4",2)
  MsgBox(0,0,"c5",2)
EndFunc
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
GuiSetOnEvent похоже не запускает функцию, если она уже работает.

Код:
#include "GUIConstants.au3"

Opt('MustDeclareVars', 1)
Opt("GUIOnEventMode", 1)

Global $mainwindow = GUICreate("Monitoring", 200, 200)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
Global $Pausebutton = GUICtrlCreateButton("Pause", 50, 5)
GUICtrlSetOnEvent($Pausebutton, "_Pause")
GUISetState(@SW_SHOW)
Global $Paused

While 1
	Sleep(1000)
	While $Paused
		Sleep(100)
		If $Paused Then
			ToolTip('Script is "Paused"',0,0)
		Else
			ToolTip('')
		EndIf
	WEnd
WEnd

Func _Pause()
    $Paused = Not $Paused
EndFunc

Func _Exit()
    Exit
EndFunc
 
Автор
N

Nelsy

Знающий
Сообщения
35
Репутация
8
К сложалению весь смысл паузы в таком случае пропадает, ведь если скрипт длится не 1 секунду а дольше, то паузу можно еще долго не увидеть.

Такой вариант тоже отпадает:
Код:
#include "GUIConstants.au3"

Opt('MustDeclareVars', 1)
Opt("GUIOnEventMode", 1)

Global $mainwindow = GUICreate("Monitoring", 200, 200)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
HotKeySet("{PAUSE}", "_Pause")
Global $Pausebutton = GUICtrlCreateButton("Pause", 50, 5)
GUICtrlSetOnEvent($Pausebutton, "_PressPause")
GUISetState(@SW_SHOW)
Global $Paused

While 1
        Sleep(1000)
WEnd

Func _PressPause()
	Send("{Pause}")
EndFunc

Func _Pause()
	$Paused = Not $Paused
    While $Paused
        Sleep(100)
        ToolTip('Script is "Paused"',0,0)
    WEnd
    ToolTip("")
EndFunc

Func _Exit()
	Exit
EndFunc

Судя по всему GUICtrlSetOnEvent($Pausebutton, "_Pause") не запустит функцию если в момент нажатия скрипт выполняет любую другую функцию. Тогда я вобще не понимаю, в чем смысл тогда прописывать Opt("GUIOnEventMode", 1) если он нифига не работает?

Тема остается
Не решенной
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Nelsy [?]
если скрипт длится не 1 секунду а дольше
При чём тут одна секунда?

Судя по всему GUICtrlSetOnEvent($Pausebutton, "_Pause") не запустит функцию если в момент нажатия скрипт выполняет любую другую функцию.
Выполняет.


Тогда я вобще не понимаю, в чем смысл тогда прописывать Opt("GUIOnEventMode", 1) если он нифига не работает?
Смысл в том что скрипт ждёт пока функция завершится и только тогда запускает её снова. Какой смысл запускать две одинаковые функции? Если они будут использовать глобальные переменные или писать в файлы итп. то только помешают друг другу. Всё прекрасно работает.
 
Автор
N

Nelsy

Знающий
Сообщения
35
Репутация
8
dwerf,
При чём тут одна секунда?
Притом, что после вставленого в While ... WEnd кода паузы, может идти еще сам код скрипта или мы что паузить собираемся тупо скрипт с кодом паузы? Ответ в коде под спойлером.
Код:
#include "GUIConstants.au3"

Opt('MustDeclareVars', 1)
Opt("GUIOnEventMode", 1)

Global $mainwindow = GUICreate("Monitoring", 200, 200)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
Global $Pausebutton = GUICtrlCreateButton("Pause", 50, 5)
GUICtrlSetOnEvent($Pausebutton, "_Pause")
GUISetState(@SW_SHOW)
Global $Paused

While 1
    Sleep(1000)
    While $Paused
        Sleep(100)
        If $Paused Then
            ToolTip('Script is "Paused"',0,0)
        Else
            ToolTip('')
        EndIf
    WEnd
; ОСНОВНОЙ КОД СКРИПТА! МОЖЕТ ДЛИТСЯ ГОРАЗДО БОЛЬШЕ ЧЕМ 1-у секунду, следовательно! При нажатии кнопки паузы она может произойти с задержкой, которая завит от времени выполнения основной части скрипта и места скрипта на котором была нажата клавиша паузы.
WEnd

Func _Pause()
    $Paused = Not $Paused
EndFunc

Func _Exit()
    Exit
EndFunc
Прежде чем такое говорить, проверили бы сперва предоставленный мною скрипт который кнопкой ГУЙ запускает функцию которая в свою очередь отсылает нажате клвишей ПАУЗА - нажатие клавишей должно запускать функцию паузы, но этого не проиходит.
Код:
#include "GUIConstants.au3"

Opt('MustDeclareVars', 1)
Opt("GUIOnEventMode", 1)

Global $mainwindow = GUICreate("Monitoring", 200, 200)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
HotKeySet("{PAUSE}", "_Pause")
Global $Pausebutton = GUICtrlCreateButton("Pause", 50, 5)
GUICtrlSetOnEvent($Pausebutton, "_PressPause")
GUISetState(@SW_SHOW)
Global $Paused

While 1
        Sleep(1000)
WEnd

Func _PressPause()
    Send("{Pause}")
EndFunc

Func _Pause()
    $Paused = Not $Paused
    While $Paused
        Sleep(100)
        ToolTip('Script is "Paused"',0,0)
    WEnd
    ToolTip("")
EndFunc

Func _Exit()
    Exit
EndFunc
Смысл в том что скрипт ждёт пока функция завершится и только тогда запускает её снова. Какой смысл запускать две одинаковые функции? Если они будут использовать глобальные переменные или писать в файлы итп. то только помешают друг другу. Всё прекрасно работает.
Второй пример скрипта с использованием HotKeySet("{PAUSE}", "_Pause") первого поста данной темы, наглядно показывает что AutoIt в состоянии запустить уже запущенную функцию. По мимо этого я уже встречал на форуме подобные темы, в решении которых утверждается что данная опция Opt("GUIOnEventMode", 1) призвана решить эту проблему в случае использования в скрипте GUI.
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Nelsy [?]
Прежде чем такое говорить, проверили бы сперва предоставленный мною скрипт который кнопкой ГУЙ запускает функцию которая в свою очередь отсылает нажате клвишей ПАУЗА - нажатие клавишей должно запускать функцию паузы, но этого не проиходит.
Если вы умеете думать, это не значит что другие дураки.

В вашем примере функция _PressPause не завершается - значит и не запускается снова:
Код:
#include "GUIConstants.au3"

Opt('MustDeclareVars', 1)
Opt("GUIOnEventMode", 1)

Global $mainwindow = GUICreate("Monitoring", 200, 200)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
HotKeySet("{PAUSE}", "_Pause")
Global $Pausebutton = GUICtrlCreateButton("Pause", 50, 5)
GUICtrlSetOnEvent($Pausebutton, "_PressPause")
GUISetState(@SW_SHOW)
Global $Paused

While 1
        Sleep(1000)
WEnd

Func _PressPause()
	MsgBox(0, '', '_PressPause start')
    Send("{Pause}")
	MsgBox(0, '', '_PressPause end')
EndFunc

Func _Pause()
	MsgBox(0, '', '_Pause start')
    $Paused = Not $Paused
    While $Paused
        Sleep(100)
        ToolTip('Script is "Paused"',0,0)
    WEnd
    ToolTip("")
	MsgBox(0, '', '_Pause end')
EndFunc

Func _Exit()
    Exit
EndFunc

Если я написал "выполняет", значит у меня были на то причины:
Код:
#include "GUIConstants.au3"

Opt('MustDeclareVars', 1)
Opt("GUIOnEventMode", 1)

Global $mainwindow = GUICreate("Monitoring", 200, 200)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
Global $Pausebutton = GUICtrlCreateButton("Pause", 50, 5)
GUICtrlSetOnEvent($Pausebutton, "_PressPause")
GUISetState(@SW_SHOW)
Global $Paused
_Sleep()

While 1
	Sleep(1000)
WEnd

Func _PressPause()
	MsgBox(0, '', 'PausePressed')
EndFunc

Func _Sleep()
	While 1
		Sleep(1000)
	WEnd
EndFunc

Func _Exit()
    Exit
EndFunc

Второй пример скрипта с использованием HotKeySet("{PAUSE}", "_Pause") первого поста данной темы, наглядно показывает что AutoIt в состоянии запустить уже запущенную функцию. По мимо этого я уже встречал на форуме подобные темы, в решении которых утверждается что данная опция Opt("GUIOnEventMode", 1) призвана решить эту проблему в случае использования в скрипте GUI.
Используйте дальше клавиши как в первом посте.
Дайте ссылки.
Попробуйте использовать GUIRegisterMsg.
 
Верх