Что нового

[Автоматизация] Постоянно запущенная программа

BLITH

Новичок
Сообщения
7
Репутация
0
Всем Привет.

Начну с того что я запланировал.
Хочу написать приложение меняющее фоновое изображение рабочего стола в определенное время. Саму функцию изменения я запускаю ShellExecute. Картинка меняется. Но проблема в том что приложение тут же закрывается после смены изображения. Я хочу чтобы она постоянно работала и проверяла время. Есть ли функция для постоянной проверки значения.
Тут часть моего приложения.

Global $t = @HOUR
If $t = 0 Then
ShellExecute("тут указанные адресса")
EndIf
If $t = 1 Then
ShellExecute("тут указанные адресса")
EndIf
If $t = 2 Then
ShellExecute("тут указанные адресса")
EndIf
If $t = 3 Then
ShellExecute("тут указанные адресса")
EndIf

И так от 0 до 23 часов.
 
Автор
B

BLITH

Новичок
Сообщения
7
Репутация
0
А можно поподробней? Я уже как то связывался с While. Но не уловил важность момента. Про Sleep понял. Мне нужно раз в 30-40 минут проверять.
 

Dark-Side

Знающий
Сообщения
72
Репутация
17
BLITH сказал(а):
Всем Привет.

Начну с того что я запланировал.
Хочу написать приложение меняющее фоновое изображение рабочего стола в определенное время. Саму функцию изменения я запускаю ShellExecute. Картинка меняется. Но проблема в том что приложение тут же закрывается после смены изображения. Я хочу чтобы она постоянно работала и проверяла время. Есть ли функция для постоянной проверки значения.

Чтобы значение постоянно проверялось и прогарма не закрывалась - надо использовать бесконечные циклы.
While 1 - один из них.
Все, что заключено в while будет выполняться до тех пор, пока выражение возле while не станет ложью. Так как в 1 = True = правда, то цикл никогда не закончится.
Из него можно выйти только через ExitLoop.

Вот решение твоей задачи.
Код:
Dim $hour, $hour_old = ""

While 1 ; Бесконесный цикл - прогармма никогда не закроется
	
	$hour = @HOUR ; Узнаем текущий час
	
	If $hour <> $hour_old Then ; Если час изменился
		
		Switch $hour ; Не знаю как тебе описать русским языком, но суть, думаю, поимешь)
			Case "01"
				ShellExecute("тут указанные адреса")
			Case "02"
				ShellExecute("тут указанные адреса")
			Case "03"
				ShellExecute("тут указанные адреса")
			Case "04"
				ShellExecute("тут указанные адреса")
			Case "05"
				ShellExecute("тут указанные адреса")
			Case "06"
				ShellExecute("тут указанные адреса")
			Case "07"
				ShellExecute("тут указанные адреса")
			Case "08"
				ShellExecute("тут указанные адреса")
			Case "09"
				ShellExecute("тут указанные адреса")
			Case "10"
				ShellExecute("тут указанные адреса")
			Case "11"
				ShellExecute("тут указанные адреса")
			Case "12"
				ShellExecute("тут указанные адреса")
			Case "13"
				ShellExecute("тут указанные адреса")
			Case "14"
				ShellExecute("тут указанные адреса")
			Case "15"
				ShellExecute("тут указанные адреса")
			Case "16"
				ShellExecute("тут указанные адреса")
			Case "17"
				ShellExecute("тут указанные адреса")
			Case "18"
				ShellExecute("тут указанные адреса")
			Case "19"
				ShellExecute("тут указанные адреса")
			Case "20"
				ShellExecute("тут указанные адреса")
			Case "21"
				ShellExecute("тут указанные адреса")
			Case "22"
				ShellExecute("тут указанные адреса")
			Case "23"
				ShellExecute("тут указанные адреса")
			Case "24"
				ShellExecute("тут указанные адреса")
		EndSwitch
			
		$hour_old = $hour
		
	EndIf
	
WEnd

Код можно значительно уменьшить есть использовать в качестве имени изображения рабочего стола использовать текущий час. Например, изображение рабочего стола "22.jpg" будет появляться в 22 часа. В таком случае можно сделать.
Код:
Dim $hour, $hour_old = ""

While 1 ; Бесконесный цикл - прогармма никогда не закроется
	
	$hour = @HOUR ; Узнаем текущий час
	
	If $hour <> $hour_old Then ; Если час изменился
		ShellExecute("C:\МояПапка\" & $hour & ".jpg") ; C:\МояПапка\<Текущий_час>.jpg	
		$hour_old = $hour
	EndIf
	
WEnd
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
BLITH [?]
Мне нужно раз в 30-40 минут проверять.
Код:
Global $i
AdlibRegister("_Listener", 250) ; время опроса 250 ms. 30 min = 1800000ms

While $i <> 3 ; количество запланированных проверок или While 1 бесконечно (тогда нужно предусмотреть выход из цикла)
	Sleep(250)
WEnd
Exit

Func _Listener()
    If ProcessExists("AutoIt3.exe") Then
		ConsoleWrite("Ok!")
	Else
	    ConsoleWrite("Failure!")
	EndIf
	$i += 1
	Return $i
EndFunc
 
Автор
B

BLITH

Новичок
Сообщения
7
Репутация
0
А вот еще пример. Я пишу програмку типа виртуального собеседника. Он говорит методом TrayTip.
Так вот я поставил проверку открытия некоторых окон, что бы при открытии окна он как то комментировал. Так он комментирует. Только с заданым промежутком времени. А возможно ли после его комментирования остановить проверку до тех пор пока окно не закроется. При этом не закрывая саму программу.
While 1
If WinExists("Безымянный") Then
TrayTip("Report", "Пописать захотелось?", 1)
Sleep(3000)
EndIf
WEnd
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
BLITH [?]
А возможно ли после его комментирования остановить проверку до тех пор пока окно не закроется. При этом не закрывая саму программу.
Код:
While 1
	If WinExists("Безымянный") Then
		TrayTip("Report", "Пописать захотелось?", 1)
		Sleep(3000)
		TrayTip("", "", 1)
		While 1 
			If Not WinExists("Безымянный") Then ExitLoop
			; TrayTip("", "", 1) -> Ответ #7
			Sleep(250)
		WEnd
	EndIf
	Sleep(250)
WEnd
 

Dark-Side

Знающий
Сообщения
72
Репутация
17
Мог бы и спасибо сказать =\

Учи программирование и пытайся сам глубоко-глубоко размышлять над проблемой :smile:

Код:
Dim $flag = 1

While 1
	If WinExists("Безымянный") and ($flag = 1) Then
		TrayTip("Report", "Пописать захотелось?", 1)
		Sleep(1000)
		$flag = 0
	EndIf

	If Not WinExists("Безымянный") and ($flag = 0) Then $flag = 1
WEnd




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

Garrett, мне нравится твоя реализация, но по-моему очистку трея не обязательно в цикл заносить. Её можно написать прямо перед вторым while 1 т.к. нам сообщение надо очистить только один раз =)
И если честно, то я не вижу никакой надобности в его очистке, я бы вырезал эту команду.
Но второй while порадовал :ok:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett
Внутренний цикл, наверное, упростить можно
Код:
;...
While WinExists("Безымянный")
	Sleep(250)
WEnd
;...

Garrett [?]
TrayTip имеет минимальный порог 10 сек.
Я делаю следующим образом:
Код:
$iShowTrayTip = 5 ;sec
HotKeySet('{Esc}', '_Exit')

TrayTip('Test', 'Сообщение будет показано ' & $iShowTrayTip & ' сек.', $iShowTrayTip, 1)
AdlibRegister('_KillTrayTip', $iShowTrayTip * 1000)

While 1
	Sleep(100)
WEnd

Func _Exit()
	Exit
EndFunc   ;==>_Exit

Func _KillTrayTip()
	TrayTip('', '', 1)
	AdlibUnRegister('_KillTrayTip')
EndFunc   ;==>_KillTrayTip
 
Автор
B

BLITH

Новичок
Сообщения
7
Репутация
0
Отлично. Думаю мне этого достаточно. Щас буду разжёвывать, потому что новенький в программировании. Всем поставлю спасибо, потому что у всех все полезное сказано.
 
Верх