Что нового

Как зпустить одновременно два цикла ?

agikon

Знающий
Сообщения
789
Репутация
17
ну смотрите у меня выходит так что в скрипте работает только один цикл. А второй запускаается только тогда когда заканчивается первый.

Как сделать чтобы работало одновременно два цикла?
 

VladUs

Скриптер
Сообщения
621
Репутация
181
agikon
Два цикла одновременно работать в Autoit не будут, в виду того , что данный язык не поддерживает многопоточность.
Попоробуйте использовать функцию AdlibRegister (), либо вложите один цикл в другой
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Попробуй так - добавь циклы в функции:
Код:
AdlibRegister('Cicle1', 1)
AdlibRegister('Cicle2', 100)

While 1
	Sleep(100)
WEnd

Func Cicle1()
    ;Тут 1 цикл
EndFunc

Func Cicle2()
    ;Тут 2 цикл
EndFunc

P.S. Если что, смотри в справке функцию AdlibRegiter() :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
agikon [?]
у меня выходит так что в скрипте работает только один цикл. А второй запускаается только тогда когда заканчивается первый.
Вы бы кусок Вашего кода привели или написали, что Вы хотите сделать, может все в одном цикле можно сделать.

Zaramot [?]
Попробуй так - добавь циклы в функции
Вы проверьте работоспособность Вашего кода.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Zaramot
Попробуй так - добавь циклы в функции
Вы проверьте работоспособность Вашего кода.

Я проверил таким образом:
Код:
GUICreate("Form1", 633, 449, 192, 124)
$Input1 = GUICtrlCreateInput("", 80, 80, 409, 21)
$Input2 = GUICtrlCreateInput("", 112, 240, 433, 21)
GUISetState(@SW_SHOW)

AdlibRegister('AAA', 1)
AdlibRegister('BBB', 100)

While 1
	If GUIGetMsg() = -3 Then Exit
WEnd

Func AAA()
	GUICtrlSetData($Input1, Random(0, 1000000))
EndFunc

Func BBB()
	GUICtrlSetData($Input2, Random(0, 1000000000))
EndFunc

и всё работает :ok:
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
есть два цикла.
первый скрипт обрабатывает сам скрипт.
второй цикл обрабатывет меню в панели трей.
вот что не делаю работает или первый или второй цикл, а одновременно два цикла не работают. То есть работает или сам скрипт а меню в панели трей не работает, или работает токо меню а сам скрипт не работает.
делаю так

Код:
AdlibRegister('Cicle1', 1)
AdlibRegister('Cicle2', 1)

Func  Cicle1()
While 1

:код цикла скрипта

WEnd
EndFunc

Func  Cicle2()
While 1

:код цикла меню в панели трей

WEnd
EndFunc


Работает токо первый цикл то есть Cicle1, аа код меню не обрабатывается. ибо нажимаю на выход в панели трей и со скрипта не выходит, то есть на кнопки меню с панели трей не реагирует.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Код:
AdlibRegister('_Menu', 1)

; Main while
While
;код скрипта
WEnd

Func  _Menu()
;код скрипта
EndFunc
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
Гарет, если сделать по твоей схеме то наоборот меню работает, а код самого скрипта не работает.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
OffTopic:
Попробуй запихнуть 2 цикл в первый.
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
не пихается.
в каком разделе справки можно прочитать про AdlibRegister?

похожие фуункции ести но именно этой не нашел.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Zaramot [?]
Попробуй так - добавь циклы в функции:
Я проверил таким образом:
А где тут циклы в функциях?

agikon,
Попробуйте так:
Код:
#NoTrayIcon
#include <GUIConstantsEx.au3>

Opt('TrayMenuMode', 1)

$hGui = GUICreate('Test', 250, 200)
$nLabel_1 = GUICtrlCreateLabel('', 50, 10, 150, 20)
$nLabel_2 = GUICtrlCreateLabel('', 50, 40, 150, 20)
$nLabel_3 = GUICtrlCreateLabel('', 50, 80, 150, 20)
$nButton = GUICtrlCreateButton('Go', 75, 120, 100, 40)

$prefsitem = TrayCreateItem("Preferences")
TrayCreateItem("")
$aboutitem = TrayCreateItem("About")
TrayCreateItem("")
$exititem = TrayCreateItem("Exit")

TraySetState()
GUISetState()

AdlibRegister('_Label_1', 200)
AdlibRegister('_Label_2', 400)
AdlibRegister('_Label_3', 1000)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nButton
			MsgBox(64, 'Info', @ComputerName)
	EndSwitch
	$msg = TrayGetMsg()
	Switch $msg
		Case 0
			ContinueLoop
		Case $prefsitem
			MsgBox(64, "Preferences:", "OS:" & @OSVersion)
		Case $aboutitem
			MsgBox(64, "About:", "AutoIt3-Tray-sample.")
		Case $exititem
			Exit
	EndSwitch
WEnd

Func _Label_1()
	GUICtrlSetData($nLabel_1, Random(100, 100000))
EndFunc   ;==>_Label_1

Func _Label_2()
	GUICtrlSetData($nLabel_2, Random(100000, 100000000))
EndFunc   ;==>_Label_2

Func _Label_3()
	GUICtrlSetData($nLabel_3, StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC))
EndFunc   ;==>_Label_3
Или так:
Код:
#NoTrayIcon
#include <GUIConstantsEx.au3>

Global $ahCallBack_1, $ahCallBack_2, $ahCallBack_3
Opt('TrayMenuMode', 1)

$hGui = GUICreate('Test', 250, 200)
$nLabel_1 = GUICtrlCreateLabel('', 50, 10, 150, 20)
$nLabel_2 = GUICtrlCreateLabel('', 50, 40, 150, 20)
$nLabel_3 = GUICtrlCreateLabel('', 50, 80, 150, 20)
$nButton = GUICtrlCreateButton('Go', 75, 120, 100, 40)

$prefsitem = TrayCreateItem("Preferences")
TrayCreateItem("")
$aboutitem = TrayCreateItem("About")
TrayCreateItem("")
$exititem = TrayCreateItem("Exit")

TraySetState()
GUISetState()

$ahCallBack_1 = _CallBack_Init('_Label_1', 200)
$ahCallBack_2 = _CallBack_Init('_Label_2', 400)
$ahCallBack_3 = _CallBack_Init('_Label_3', 1000)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $nButton
			MsgBox(64, 'Info', @ComputerName)
	EndSwitch
	$msg = TrayGetMsg()
	Switch $msg
		Case 0
			ContinueLoop
		Case $prefsitem
			MsgBox(64, "Preferences:", "OS:" & @OSVersion)
		Case $aboutitem
			MsgBox(64, "About:", "AutoIt3-Tray-sample.")
		Case $exititem
			ExitLoop
	EndSwitch
WEnd
_Exit()

Func _Label_1()
	GUICtrlSetData($nLabel_1, Random(100, 100000))
EndFunc   ;==>_Label_1

Func _Label_2()
	GUICtrlSetData($nLabel_2, Random(100000, 100000000))
EndFunc   ;==>_Label_2

Func _Label_3()
	GUICtrlSetData($nLabel_3, StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC))
EndFunc   ;==>_Label_3

Func _Exit()
	_CallBack_Free($ahCallBack_1)
	_CallBack_Free($ahCallBack_2)
	_CallBack_Free($ahCallBack_3)
	Exit
EndFunc   ;==>_Exit

Func _CallBack_Init($sFuncName, $iTime, $sParam = '')
	Local $hCallBack = DllCallbackRegister($sFuncName, 'int', $sParam)
	Local $aTimer = DllCall('user32.dll', 'uint', 'SetTimer', _
			'hwnd', 0, 'uint', 0, 'int', $iTime, 'ptr', DllCallbackGetPtr($hCallBack))
	Local $ahCallBack[2] = [$hCallBack, $aTimer[0]]
	Return $ahCallBack
EndFunc   ;==>_CallBack_Init

Func _CallBack_Free($ahCallBack)
	If $ahCallBack[0] <> -1 Then DllCallbackFree($ahCallBack[0])
	If $ahCallBack[1] <> -1 Then DllCall('user32.dll', 'int', 'KillTimer', 'hwnd', 0, 'uint', $ahCallBack[1])
EndFunc   ;==>_CallBack_Free
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
у вас у всех у функциях нет ц мклов. а мне нужны циклы в функциях.
вот так
Код:
AdlibRegister('Cicle1', 1)
AdlibRegister('Cicle2', 1)

Func  Cicle1()
While 1
:код цикла скрипта
WEnd
EndFunc

Func  Cicle2()
While 1
:код цикла меню в панели трей
WEnd
EndFunc


только почему это не работает я не понимаю.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
madmasles
А где тут циклы в функциях?
Код:
AdlibRegister('AAA', 1) ;1 цикл
AdlibRegister('BBB', 100) ;2 цикл


agikon
Работает токо первый цикл то есть Cicle1, аа код меню не обрабатывается. ибо нажимаю на выход в панели трей и со скрипта не выходит, то есть на кнопки меню с панели трей не реагирует.
Код:
AdlibRegister('Cicle1', 1)
AdlibRegister('Cicle2', 1)

Func  Cicle1()
While 1

:код цикла скрипта

WEnd
EndFunc

Func  Cicle2()
While 1

:код цикла меню в панели трей

WEnd
EndFunc

Убери в функции цикл While ! Должно получится так:
Код:
AdlibRegister('Cicle1', 1)
AdlibRegister('Cicle2', 1)

Func  Cicle1()
 ;код цикла скрипта
EndFunc

Func  Cicle2()
 ;код цикла меню в панели трей
EndFunc


Функция AdlibRegister() заменяет цикл.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
agikon [?]
у вас у всех у функциях нет ц мклов. а мне нужны циклы в функциях.
Вы напишите, что Вы хотите сделать конкретно, а не общие слова. Что делает (должен делать) :код цикла скрипта и :код цикла меню в панели трей.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
agikon, madmasles прав! Лучше бы ты выложил полностью скрипт.
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
чтобы не морочить вам голову вот выкладываю сам код а вы посмотрите что с ним можно сделать
Код:
#include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>

Opt("TrayMenuMode",3)
$about      = TrayCreateItem("About")
$exit        = TrayCreateItem("Выход")


GUICreate('test', 400, 200)
$nRadio1 = GUICtrlCreateRadio('aaa', 50, 20, 130, 20)
GUICtrlSetState(-1, $GUI_CHECKED)
$nRadio2 = GUICtrlCreateRadio('bbb', 50, 60, 150, 20)
$nRadio3 = GUICtrlCreateRadio('ccc', 50, 90, 100, 20)
$nButton = GUICtrlCreateButton('Go', 50, 120, 100, 40)
GUISetState()


While 1
	$nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nButton

            If BitAND(GUICtrlRead($nRadio1), $GUI_CHECKED) Then
                
					While 1
						MsgBox(64, 'aaa', 'aaa')
					WEnd	
            ;Else
			ElseIf BitAND(GUICtrlRead($nRadio2), $GUI_CHECKED) Then
			        While 1
						MsgBox(64, 'bbb', 'bbbb')
					WEnd
			Else
					While 1
						MsgBox(64, 'ccc', 'ccc')
					WEnd
            EndIf
    EndSwitch
WEnd




While 1
    $msg = TrayGetMsg()
    Select
        Case $msg = 0
            ContinueLoop
        Case $msg = $about
            Msgbox(64,"about","about")
        Case $msg = $exit
            ExitLoop
		EndSelect
WEnd


вот как тот второй цикл который отвечает за меню в панели трей можно прикрутить?
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
по вашим примерам сделал так хоть теперь работает и меню и сам скрипт, но только до того времени когда нажимаю кнопку GO, скрипт запускакется и меню опять не реагирует. Подкорректируйте пожалуйста где собака зарыта.

вот сам код

Код:
#include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>

Opt("TrayMenuMode",3)
$about      = TrayCreateItem("About")
$exit        = TrayCreateItem("Выход")


GUICreate('test', 400, 200)
$nRadio1 = GUICtrlCreateRadio('aaa', 50, 20, 130, 20)
GUICtrlSetState(-1, $GUI_CHECKED)
$nRadio2 = GUICtrlCreateRadio('bbb', 50, 60, 150, 20)
$nRadio3 = GUICtrlCreateRadio('ccc', 50, 90, 100, 20)
$nButton = GUICtrlCreateButton('Go', 50, 120, 100, 40)
GUISetState()


While 1
	$nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nButton

            If BitAND(GUICtrlRead($nRadio1), $GUI_CHECKED) Then
                
					While 1
						MsgBox(64, 'aaa', 'aaa')
					WEnd	
            ;Else
			ElseIf BitAND(GUICtrlRead($nRadio2), $GUI_CHECKED) Then
			        While 1
						MsgBox(64, 'bbb', 'bbbb')
					WEnd
			Else
					While 1
						MsgBox(64, 'ccc', 'ccc')
					WEnd
            EndIf
		EndSwitch
		
	
	
	$msg = TrayGetMsg()
    Switch $msg
        Case 0
            ContinueLoop
        Case $about
            MsgBox(64, "Preferences:", "OS:" & @OSVersion)

        Case $exit
            Exit
    EndSwitch
		
WEnd
 
Верх