Что нового

Организация запуска, остановки цикла по времени.

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
Здравствуйте!
Скажу сразу, я новичок в программировании в связи с чем возникает очень много вопросов и пытаюсь их решать самостоятельно (пользуясь форумом и поиском)! Но, возник вопрос который я не могу победить:
в скрипте есть несколько цикличных функций While...WEnd, как их привязать к часам? т.е чтоб каждый цикл работал в определенное время?
Перепробовал множество вариантов (подозреваю, что половина в принципе не могут работать, но даже просто остановить выполнение цикла по времени не смог :( )
Одна из конструкций которую я пробовал:
Код:
$time = @MIN
	$iN = 51 ;здесь ставлю время для проверки заведомо большее..

		
While $time <= $iN

	;здесь тело цикла


	WEnd


В этом случае цикл не останавливается, хотя при наступлении 51 минуты, больше не запускается. :scratch:
А вот как организовать начало выполнения цикла...даже не представляю примерно...


Добавлено:
Сообщение автоматически объединено:

:smile: выход то оказалось элементарно сделать

Код:
HotKeySet("{ESC}", "vyx")

    $iN = 51 ;здесь ставлю время для проверки заведомо большее..
       
While 1
If @MIN = $iN Then vyx()
    ;здесь тело цикла


    WEnd
Func vyx() 
	ToolTip ( "Good Buy", 0,0)
	Sleep (3000)
	Exit
	EndFunc



Вопрос остается открытым, как включить выполнение цикла по времени?


Добавлено:
Сообщение автоматически объединено:

Думаю зря тему создал...
ответ то оказался прост...

Код:
HotKeySet("{ESC}", "vyx")

  $i=48
	$iA=47
	
	
	While 1
If @MIN = $iA Then
	pervyj()
	Else 
	Sleep (100)
	EndIf
	WEnd
	
Func pervyj()
While 2
If @MIN = $i Then vyx()
    ;здесь тело цикла

    WEnd
EndFunc

Func vyx()
    ToolTip ( "Good Buy", 0,0)
    Sleep (3000)
    Exit
    EndFunc



Я бился полночи над этим вопросом!!! А решил за 40 минут!
Люди, ночью надо спать!!!

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

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
Код:
Global $Paused
HotKeySet("{F1}", "TPause")
HotKeySet("{ESC}", "vyx")
WinActivate("*- Mozilla Firefox")
WinWaitActive("*- Mozilla Firefox")
$x01 = 208
$x02 = 43
;--------------------------------------------------------------------------------------
MouseClick ("primary", $x01, $x02)
send ("http://моя ссылка")
sleep (10)
send ("{enter}")

				$iA= 8 ;начало работы
				$i= 9
	
				While 1
			If @MIN = $iA Then
							pervyj()
				Else 
				Sleep (1000)
				EndIf
				WEnd

				Func pervyj()
					While 2
						If @MIN = $i Then vtoroy1()
						send ("{F5}")
						Sleep (500)

							$x1 = 570
							$y1 = 350
							$x2 = 980
							$y2 = 750
							$x3 = 980
							$y3 = 350
							$x4 = 570
							$y4 = 750
						Local $a = PixelSearch($x2, $y2, $x1, $y1, 0xBC9343, 10) 
						If Not @error Then
						MouseMove($a[0], $a[1], 10)
						EndIf
						$pos = MouseGetPos ()
						MouseClick ("primary", $pos[0]+62, $pos[1])
						send ("10")
						MouseClick ("primary", $pos[0]+122, $pos[1])
						sleep (500)
					WEnd
				EndFunc
;--------------------------------------------------------------------------------------------				
;должен начаться второй (точнее второе действие) цикл! он начинается, но почему-то прерывается выполнением предыдущего.? 
Func vtoroy1()
MouseClick ("primary", $x01, $x02)
Send ("http://моя ссылка")
Sleep (50) 
Send ("{Enter}")                       
EndFunc            

					$iA2 = 10
					$i2 = 11
					While 3
					If @MIN = $iA2 Then
										vtoroy()
								Else 
						Sleep (1000)
					EndIf
					WEnd
				
				Func vtoroy()
					While 1
							If @MIN = $i Then tretiy()
							send ("{F5}")
							Sleep (500)
							
;---------------------------------------------------------------------------------------------
; здесь другие однотипные циклы
;---------------------------------------------------------------------------------------------



Func TPause()   ;прикручена пауза
    $Paused = NOT $Paused
    While $Paused
        sleep(100)
        ToolTip('Script is "Paused"',0,0)
    WEnd
    ToolTip("")
EndFunc



Func vyx()  ;прикрутил выход
	ToolTip ( "Good Buy", 0,0)
	Sleep (3000)
	Exit
	EndFunc
 

agikon

Знающий
Сообщения
789
Репутация
17
посмотрите в сторону
Код:
Adlibregister и timerinit()

возможно в их помощью легче будет реализовать.
 
Автор
M

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
Да я думал над ними, но решил не прикручивать их, все же это таймер...
А мне нужно полноценное "расписание". Мне кажется, что в первой части скрипта не реализовано завершение цикла While 2 ...хотя...
Не пойму...

Код:
Func pervyj()
					While 2
						If @MIN = $i Then vtoroy1()
						Else ; <---попробовал так
						
						send ("{F5}")
						Sleep (500)

							$x1 = 570
							$y1 = 350
							$x2 = 980
							$y2 = 750
							$x3 = 980
							$y3 = 350
							$x4 = 570
							$y4 = 750
							
						Local $a = PixelSearch($x2, $y2, $x1, $y1, 0xBC9343, 10) 
						If Not @error Then
						MouseMove($a[0], $a[1], 10)
						EndIf
						$pos = MouseGetPos ()
						MouseClick ("primary", $pos[0]+62, $pos[1])
						send ("10")
						MouseClick ("primary", $pos[0]+122, $pos[1])
						sleep (500)
					EndIf ;<-------------и так, но не получается
					WEnd
				EndFunc

выдает ошибку :mad: хотя в предыдущем цикле реализация такая же конструкция. Где я не прав?
 
Автор
M

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
ну или ладно, поставим вопрос по другому
почему останавливается функция

Код:
$time = @MIN
$i = 1 ; где $i равняется минутам, для проверки ставим на минуту больше чем текущая.
$q = 1
While $i <= $time
  
    $q = $q + 1
	ToolTip ($q)
	Sleep (1000)
	WEnd
MsgBox(0, "Value of $i is:", $q)



хотя условие не выполненно?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
mr.Gbabak [?]
почему останавливается функция
Ваш цикл никогда не остановится, потому что $i всегда будет меньше $time, и уж тем более не будет ровняться $time! А это значить TRUE (истина) для цикла. А цикл, как нам известно, работает до тех пор, пока соблюдена истина.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
mr.Gbabak,
Код:
$sTime = @MIN
While $sTime == @MIN
	ToolTip(StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC), 0, 0)
	Sleep(1000)
WEnd
ToolTip('')
MsgBox(64, 'Info', 'Все' & @LF & $sTime & @LF & StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC))

Или так.
Код:
Dim $aMin[4] = [3, 7, 9, 11];3 - кол-во, вместо 7, 9, 11 поставьте свои минуты
HotKeySet('{Esc}', '_Exit')
While 1
	For $i = 1 To $aMin[0]
		While $aMin[$i] = @MIN
			ToolTip(StringFormat('%d период.\n%02d:%02d:%02d', $i, @HOUR, @MIN, @SEC), 0, 0)
			Sleep(1000)
		WEnd
	Next
	ToolTip(StringFormat('%s\n%02d:%02d:%02d', 'Вне периодов.', @HOUR, @MIN, @SEC), 0, 0)
	Sleep(1000)
WEnd

Func _Exit()
	Exit
EndFunc   ;==>_Exit
 
Автор
M

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
Ваш цикл никогда не остановится
она даже цикл не выполняет, неостанавливается она при условии
Код:
While $i >= $time

За примеры спасибо, но я не совсем понял (читай совсем не понял) как тогда можно остановить один цикл While...Wend и начать другой по времени?
 

madmasles

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

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
mr.Gbabak [?]
как тогда можно остановить один цикл While...Wend и начать другой по времени?
Код:
While Execute('(@HOUR & ":" & @MIN) <> 19:56')
	Sleep(1000)
WEnd

MsgBox(64, "Time Out!", @HOUR & ":" & @MIN)

While Execute('(@HOUR & ":" & @MIN) <> 19:58')
	Sleep(1000)
WEnd

MsgBox(64, "Time Out!", @HOUR & ":" & @MIN)




Добавлено:
Сообщение автоматически объединено:

mr.Gbabak [?]
Но, возник вопрос который я не могу победить:
в скрипте есть несколько цикличных функций While...WEnd, как их привязать к часам? т.е чтоб каждый цикл работал в определенное время?
Вот тут поподробнее, так как в одно и тоже время могут работать несколько функций! Это вы учитываете?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett,
А зачем Execute() ?
 
Автор
M

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
как в одно и тоже время могут работать несколько функций! Это вы учитываете?
так в том-то и дело, чтоб они просто запускались по очереди, но не с таймера, а по времени!!!


Еще маленький вопрос: не могу симулировать нажатие клавиши CTRL+A :scratch:
Код:
Send("^!a") ;не работает


Send("{CTRLDOWN}")
send ("a")
send ("{CTRLUP}"); тоже не работает


 Send("{CTRLDOWN}a{CTRLUP}"); и так не работает
 
Автор
M

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
Garrett
madmasles [?]
Я ничего не понял, Вы объясните, что Вы хотите сделать и какие действия будут в циклах.


постараюсь:
К примеру время Скрипт (цикл №1) должен начаться в 22-00 и закончиться в 22-15,
следующий цикл должен запуститься в 22-30 и закончиться в 22-40, и третий цикл начаться в 22-45 и закончиться в 22-50. (циклы между собой отличаются переменными).
Должно получиться что-то типа

Код:
While 1
				If @MIN = $iA Then
								pervyj()
				Else 
				Sleep (100)
				EndIf
				WEnd
	
				
					While 
					sleep (100)
						WEnd
					EndFunc				
;--------------------------------------------------------------------------------------------				
;
ToolTip ("ждем время следующего цикла")
Sleep (5000)


					
					While 3
					If @MIN = $iA2 Then
										vtoroy()
								Else 
						Sleep (1000)
					EndIf
					WEnd
				
				
					While 1
							
					WEnd
					
;-----------------------------------------------------------------------------------------
ToolTip ("ждем время следующего цикла")
Sleep (5000)

					
	
					While 3
					If @MIN = $iA3 Then
										tretiy()
								Else 
						Sleep (1000)
					EndIf
					WEnd

				
					While 1
							
					WEnd
					
;---------------------------------------------------------------------------------------------
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
mr.Gbabak,
Попробуйте так.
Код:
Dim $aTime[4][2] = [[3],['21-37', '21-38'],['21-39', '21-40'],['21-41', '21-42']]
HotKeySet('{Esc}', '_Exit')
While 1
	For $i = 1 To $aTime[0][0]
		If @HOUR & '-' & @MIN = $aTime[$i][0] Then
			_MyFunc($aTime[$i][1], $i)
		EndIf
	Next
	ToolTip(StringFormat('%s\n%02d:%02d:%02d', 'Вне периодов.', @HOUR, @MIN, @SEC), 0, 0)
	Sleep(1000)
WEnd

Func _MyFunc($s_TimeEnd, $i_Index)
	Local $a_Array[4] = [3, 'Какое-то действие 1.', 'Другое действие 2.', 'Еще одно действие 3.']
	While @HOUR & '-' & @MIN <> $s_TimeEnd
		ToolTip(StringFormat('%s\n%02d:%02d:%02d', $a_Array[$i_Index], @HOUR, @MIN, @SEC), 0, 0)
		Sleep(1000)
	WEnd
EndFunc   ;==>_MyFunc

Func _Exit()
	Exit
EndFunc   ;==>_Exit
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
madmasles
Вот поэтому я спрашивал :smile:
Garrett [?]
в одно и тоже время могут работать несколько функций! Это вы учитываете?
Если потом человеку в одно и тоже время понадобится выполнять две функции то без AdlibRegister не обойтись.
 
Автор
M

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
в общем нашел довольно простое решение, (не понятно почему сразу не додумался):

Код:
$b = 0
$a = 1

While $a
	
    $ans = @MIN
	
    If $ans = 54 Then $a = $a - 1 ; где 54 нужное нам время.
	$b = $b + 1
	Sleep (1000)
WEnd
MsgBox(0,"кол-ство секунд", $b)
 

running-frag

why me?
Сообщения
441
Репутация
60
а не проще сделать по другому - при запуске скрипта считаем время (привязуемся к дате\времени запуска), создаём таймер и относительно таймера уже пляшим (точка осчёта известна, таймер тоже есть)?
 
Верх