Что нового

[Процессы] Как организовать параллельно выполняющийся таймер?

ohos

Новичок
Сообщения
47
Репутация
0
Привет, очень интересует - как организовать независимый таймер?

Пример применения: во время выполнении программы он всегда будет отсчитывать посекундное время с начала старта каких-либо действий и показывать в лейбле, ака "Прошло времени: xx:xx:xx"

p.s. как сделать сам таймер и заставить его выводить время - я знаю, но сделать его в одном скрипте с тем, который будет выполнить другие функции не удается, т.к. выполнение таймера блокирует остальную работу
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
ohos,
Попробуйте так
Код:
Global $ah_CallBack, $iTimeStart = TimerInit(), $i

HotKeySet('{Esc}', '_Exit')
$ah_CallBack = _CallBack_Init('_TimeShow', 500)
While 1
	$i += 1
	ConsoleWrite($i & @CR)
	If $i = 100 Then
		MsgBox(64, 'Info', 'i = ' & $i)
	EndIf
	Sleep(50)
WEnd

Func _Exit()
	Exit
EndFunc   ;==>_Exit

Func _TimeShow()
	ToolTip(StringFormat('%.1f sec', TimerDiff($iTimeStart) / 1000), 0, 0)
EndFunc   ;==>_TimeShow

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
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Можно проще:

Код:
;выход через иконку в трее
$timer1 = TimerInit()
$timer2 = TimerInit()

While 1
	If TimerDiff($timer1) > 1000 Then
		ConsoleWrite('-> timer1' & @CRLF)
		$timer1 = TimerInit()
	EndIf
	If TimerDiff($timer2) > 3000 Then
		ConsoleWrite('+> timer2' & @CRLF)
		$timer2 = TimerInit()
	EndIf
	Sleep(10)
WEnd
 
Автор
O

ohos

Новичок
Сообщения
47
Репутация
0
не вышло, для примера я пытался вставить этот таймер в подсчет MD5 из примера в стандартных скриптах и при запуске подсчета MD5 для большого файла - таймер остановился

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <Crypt.au3>

; Example of hashing files

; Create GUI
$hWnd=GUICreate("Hasher",370,60)
$hFileControl=GUICtrlCreateInput("",5,5,200,20)
$hBrowseButton=GUICtrlCreateButton("...",210,5,35,20)
$hHashCombo=GUICtrlCreateCombo("MD5",250,5,50,20)
GUICtrlSetData(-1,"MD2|MD4|SHA1")
$hCalcButton=GUICtrlCreateButton("Calculate",305,5,60,20)
$hHashLabel=GUICtrlCreateLabel("Hash Digest",5,35,365,20,$SS_CENTER)

GUISetState(@SW_SHOW)

;--------------
Global $ah_CallBack, $iTimeStart = TimerInit(), $i

HotKeySet('{Esc}', '_Exit')
$ah_CallBack = _CallBack_Init('_TimeShow', 500)

Func _Exit()
    Exit
EndFunc   ;==>_Exit

Func _TimeShow()
    ToolTip(StringFormat('%.1f sec', TimerDiff($iTimeStart) / 1000), 0, 0)
EndFunc   ;==>_TimeShow

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
;--------------

_Crypt_Startup()

Do
	$i += 1
    ConsoleWrite($i & @CR)
    If $i = 100 Then
        MsgBox(64, 'Info', 'i = ' & $i)
    EndIf
    Sleep(50)
	$msg=GUIGetMsg()

	Switch $msg
		Case $hBrowseButton
			$sFile=FileOpenDialog("Open file","","All files (*.*;)")
			GUICtrlSetData($hFileControl,$sFile)

		Case $hCalcButton
			$iALG_ID=0
			; What algorthm did the user choose?
			Switch GUICtrlread($hHashCombo)
				Case "MD2"
					$iALG_ID=$CALG_MD2
				Case "MD4"
					$iALG_ID=$CALG_MD4
				Case "MD5"
					$iALG_ID=$CALG_MD5
				Case "SHA1"
					$iALG_ID=$CALG_SHA1
				Case Else
					MsgBox(16,"Error","Not a valid algorithm!")
					ContinueLoop
			EndSwitch
			$sFile=GUICtrlRead($hFileControl)
			If Not FileExists($sFile) Then
				MsgBox(16,"Error","Invalid file")
				ContinueLoop
			EndIf
			$bDigest=_Crypt_HashFile($sFile,$iALG_ID)
			GUICtrlSetData($hHashLabel,$bDigest)

		Case $GUI_EVENT_CLOSE
			ExitLoop

	EndSwitch
Until False

_Crypt_Shutdown()


если я правильно понимаю AutoIt, то сделать и таймер и какие-либо действия в одном скрипте - невозможно, но возможно ли с помощью другого скрипта влиять на GUI элементы какой-нибудь программы? (например другого запущенного скрипта AutoIt)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
ohos [?]
для примера я пытался вставить этот таймер в подсчет MD5
Плохо вставляете
Код:
#include <File.au3>
#include <Crypt.au3>

Global $ah_CallBack, $iTimeStart = TimerInit(), $sFolder = @DesktopDir

$ah_CallBack = _CallBack_Init('_TimeShow', 123)
$aList = _FileListToArray($sFolder, '*', 1)
If Not @error Then
	For $i = 1 To $aList[0]
		ConsoleWrite($i & ' (' & $aList[0] & ') File: <' & $sFolder & '\' & $aList[$i] & '> MD5: ' & _
				@TAB & _Crypt_HashFile($sFolder & '\' & $aList[$i], $CALG_MD5) & @CR)
		Sleep(500)
	Next
Else
	MsgBox(16, 'Error', 'Error')
EndIf

Func _TimeShow()
	ToolTip(StringFormat('%.2f sec', TimerDiff($iTimeStart) / 1000), 0, 0)
EndFunc   ;==>_TimeShow

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
 
Верх