Что нового

[Элементы GUI] параллельное выполнение цикла и работа других элементов gui

br2

Новичок
Сообщения
12
Репутация
2
Доброго времени суток!
Столкнулся со следующей проблемой - при запуске функции с циклом (он кстати запускается и работает нормально) через кнопку, перестают работать все остальные элементы gui, даже нету возможности закрыть само окно приложения.

Задача вроде бы простая: при нажатии кнопки "Активировать" запускается некий цикл, при нажатии кнопки "Деактивировать" выходим из него, при этом должны продолжать работать другие элементы gui и выполнять свои функции.

Вот куски кода:

Код:
While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Exit
                 ...
      Case $ButtonActivirovat
            shack(1)
      Case $ButtonDeactivirovat
            shack(0)
   EndSwitch
WEnd


Код:
Func shack($param)
     ....
    $sh = GUICtrlRead($InputD)
    $sa = GUICtrlRead($InputA)
     While $param > 0
            ...
     WEnd
EndFunc


С помощью поиска нашел похожую тему, пример работает, но мне нужно параллельное выполнение цикла и работы элементов gui, была идея для каждой кнопки писать закрытие цикла, выполнения её действий и по новой открытие цикла, но думаю есть пути и проще.
Код:
If GUIGetMsg() = $Button1 Then Return 0
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 610
Репутация
2 438
Re: [Элементы GUI] работа с циклом

Используй режим событий (OnEvent mode).
Впрочем я тоже самое посоветовал и в найденной тобой теме.

А тему не помешало бы переименовать во что нибудь более расширенное.
 
Автор
B

br2

Новичок
Сообщения
12
Репутация
2
Используй режим событий (OnEvent mode).
Впрочем я тоже самое посоветовал и в найденной тобой теме.
Принцип работы у режима OnEvent, такой же, что я описал выше: прерывание - выполнение - запуск, не так ли?
Думал есть решение более грамотное для работы с циклами и gui :scratch:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 610
Репутация
2 438
br2 [?]
Думал есть решение более грамотное для работы с циклами и gui
Оно и есть грамотное, просто нужно грамотно им воспользоваться ;)

Примерно так:

Код:
Global $iShack0 = 0
Global $iShack1 = 0

Opt("GUIOnEventMode", 1)

...

GUISetOnEvent($GUI_EVENT_CLOSE, "_Events")

....

While 1
	If $iShack0 Then
		$iShack0 = 0
		shack(0)
	EndIf
	
	If $iShack1 Then
		$iShack1 = 0
		shack(1)
	EndIf
	
	Sleep(10)
WEnd

Func _Events()
	Switch @GUI_CtrlId
		Case $GUI_EVENT_CLOSE
			Exit
		Case $ButtonActivirovat
			$iShack1 = 1
		Case $ButtonDeactivirovat
			$iShack0 = 1
	EndSwitch
EndFunc


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

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
CreatoR [?]
в AutoIt не могут работать два цикла одновременно
А если так?
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>


$GUI1 = GUICreate("Test", 185, 80, 192, 114)
$Active = GUICtrlCreateButton("Active", 10, 42, 75, 25, 0)
$DeActive = GUICtrlCreateButton("Deactive", 98, 42, 75, 25, 0)
$Input1 = GUICtrlCreateInput("0", 10, 12, 75, 21)
$Input2 = GUICtrlCreateInput("0", 98, 12, 75, 21)
GUISetState(@SW_SHOW)


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Active
            shack(1)
            shack(2)
		Case $DeActive
            shack(0)
	EndSwitch
WEnd

Func shack($param)
	Switch $param
		Case 0
			AdlibRegister('_DeActive', 1)
		Case 1
			AdlibRegister('_Active')
		Case 2
			AdlibRegister('_Active2')
	EndSwitch
EndFunc

Func _Active()
	GUICtrlSetData($Input1, GUICtrlRead($Input1) + 1)
	If Not Mod(GUICtrlRead($Input1), 10) Then _
		GUICtrlSetData($Input2, GUICtrlRead($Input1))
	EndFunc
	
Func _Active2()
	If Not Mod(GUICtrlRead($Input1), 10) Then _
		GUICtrlSetBkColor($Input2, Random(0xAA0000, 0xFFAAAA))
EndFunc

Func _DeActive()
	AdlibUnRegister('_Active')
	AdlibUnRegister('_Active2')
	AdlibUnRegister('_DeActive')
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 610
Репутация
2 438
Garrett [?]
Я не вижу здесь два цикла.

Adlib можно использовать, но даже это иногда не поможет, выполнение скрипта останавливается многими функциями, или как я уже писал, дополнительными циклами.
 
Автор
B

br2

Новичок
Сообщения
12
Репутация
2
Понял задумку: создать только один цикл, а уже в нем запускать через условия, то что требует повторное выполнения. А если нужен параллельный запуск разных циклов с временными рамками (задержками), то такое возможно вынеся их в отдельное приложение (скрипт)

:graduated: спасибо за примеры! Тему думаю можно закрывать.
 
Верх