mmoalem Posted April 6, 2016 Share Posted April 6, 2016 Hi there - quite a beginner to codding so please bare with me... i am writing an autoit code that will be running 24/7 executing various tasks every 10-20 minutes. it suppose to run on unattended server but i would like to occasionally remote log in and do stuff on the server without disturbing the autoit script (while the autoit script is in Sleep count). to achieve this I will need to know at what point in the commands run it is and how long roughly until the next command (I use Sleep in between commands)... so, is there a way to create a monitor that shows me the last command executed and how long of the Sleep is left (like in a small window or in the windows task bar)? failing that any idea how can I utilize the FileWriteLog function to keep updating an always open text file ? thanks in advance michel Link to comment Share on other sites More sharing options...
AutoBert Posted April 6, 2016 Share Posted April 6, 2016 You can implement _FileWriteLog into your script. So you can reading/analysing the log and saw what script done. Link to comment Share on other sites More sharing options...
mmoalem Posted April 6, 2016 Author Share Posted April 6, 2016 hi and thanks for the answer... what I really would have liked is a countdown clock of a kind that will tell me how long I have before the next command/end of Sleep... but maybe its not possible within autoit...:( so if I understand correctly I can use _FileWriteLog to write to an open text file (opened in notepad for example so I can read it whenever I log in)... any idea how i get it to write to the file log.txt the command about to be executed - lets says Sleep (5000) followed by the time? and than I guess I will need to save the txt file... Link to comment Share on other sites More sharing options...
AutoBert Posted April 6, 2016 Share Posted April 6, 2016 (edited) You can use AdlibRegister to execut a func while maom script is sleeping or doing something else. Edited April 6, 2016 by AutoBert Link to comment Share on other sites More sharing options...
InunoTaishou Posted April 6, 2016 Share Posted April 6, 2016 Could create a small GUI with some debug info on there. I find consoles are always useful. There's also a debugging option in the AutoItSetOption parameters. expandcollapse popup; -- Created with ISN Form Studio 2 for ISN AutoIt Studio -- ; #include <StaticConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <GuiButton.au3> #include <EditConstants.au3> #include <Date.au3> AutoItSetOption("TrayMenuMode", 3) AutoItSetOption("TrayIconDebug", 3) Global $hMain = GUICreate("Example", 400, 300, -1, -1, BitOR($WS_SIZEBOX, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX)) Global $edtDebug = GUICtrlCreateEdit("Initiated @ " & _NowDate() & " : " & _NowTime(5) & @CRLF, 10, 10, 380, 225, BitOR($ES_WANTRETURN, $WS_VSCROLL, $ES_AUTOVSCROLL, $ES_AUTOHSCROLL), -1) Global $lblCurrentTimer = GUICtrlCreateLabel("Current Timer", 14, 250, 100, 20, -1, -1) Global $lblTimer = GUICtrlCreateLabel(0, 114, 250, 100, 20, -1, -1) Global $tidShowHide = TrayCreateItem("Show Debugger") Global $tidExit = TrayCreateItem("Exit") Global $iTimer = TimerInit() GUICtrlSetFont($edtDebug, 10, 400, 0, "Consolas") GUICtrlSetColor($edtDebug, "0xE1E1E1") GUICtrlSetBkColor($edtDebug, "0x1E1E1E") GUICtrlSetResizing($edtDebug, 102) GUICtrlSetFont($lblCurrentTimer, 10, 400, 0, "Segoe UI") GUICtrlSetBkColor($lblCurrentTimer, "-2") GUICtrlSetResizing($lblCurrentTimer, 66) GUICtrlSetFont($lblTimer, 10, 400, 0, "Segoe UI") GUICtrlSetBkColor($lblTimer, "-2") GUICtrlSetResizing($lblTimer, 66) While (True) Switch (TrayGetMsg()) Case $tidShowHide If (TrayItemGetText($tidShowHide) = "Show Debugger") Then Debug("Showing debugger" & @CRLF) GUISetState(@SW_SHOW, $hMain) TrayItemSetText($tidShowHide, "Hide Debugger") Else Debug("Hiding debugger" & @CRLF) GUISetState(@SW_HIDE, $hMain) TrayItemSetText($tidShowHide, "Show Debugger") EndIf Case $tidExit GUIDelete($hMain) Exit 0 EndSwitch Switch (GUIGetMsg()) Case $GUI_EVENT_CLOSE GUIDelete($hMain) Exit 0 Case Else GUICtrlSetData($lblTimer, Round(TimerDiff($iTimer) / 1000, 2)) If (TimerDiff($iTimer) > 30000) Then Debug("Timer reached max timeout, resetting" & @CRLF) $iTimer = TimerInit() EndIf EndSwitch WEnd Func Debug($sMsg) $sMsg = "[" & _NowDate() & "] [" & _NowTime(5) & "] " & $sMsg GUICtrlSetData($edtDebug, GUICtrlRead($edtDebug) & $sMsg) EndFunc ;==>Debug Func FileWriteToLog(Const $sMsg) Local $hLogFile = FileOpen(@ScriptDir & "\My log file.log") If ($hLogFile) Then FileWrite($hLogFile, $sMsg) Return FileClose($hLogFile) EndIf EndFunc ;==>FileWriteToLog Link to comment Share on other sites More sharing options...
markyrocks Posted April 6, 2016 Share Posted April 6, 2016 2 hours ago, mmoalem said: hi and thanks for the answer... what I really would have liked is a countdown clock of a kind that will tell me how long I have before the next command/end of Sleep... but maybe its not possible within autoit...:( so if I understand correctly I can use _FileWriteLog to write to an open text file (opened in notepad for example so I can read it whenever I log in)... any idea how i get it to write to the file log.txt the command about to be executed - lets says Sleep (5000) followed by the time? and than I guess I will need to save the txt file... Anything is possible with autoit. Just depends on how much time and determination you have. Spoiler "I Believe array math to be potentially fatal, I may be dying from array math poisoning" Link to comment Share on other sites More sharing options...
JohnOne Posted April 6, 2016 Share Posted April 6, 2016 Make a gui, and replace your Sleep Function with a countdown timer on that gui. AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans. Link to comment Share on other sites More sharing options...
InunoTaishou Posted April 7, 2016 Share Posted April 7, 2016 (edited) Unfortunately not everything is possible. Native classes and multithreading lol Also, change GUICtrlSetData($lblTimer, Round(TimerDiff($iTimer) / 1000, 2)) To GUICtrlSetData($lblTimer, 30 - Round(TimerDiff($iTimer) / 1000, 2)) And there's your countdown timer. Edited April 7, 2016 by InunoTaishou Link to comment Share on other sites More sharing options...
alien4u Posted April 7, 2016 Share Posted April 7, 2016 Hi @mmoalem Is also helpful for you that you know that there is different ways to make this script run on background and you still can interact with the System without interrupting the script even if the script is doing his task. For example if your entire script use @SW_HIDE flag on anything the script execute or run and also only use ControlSend or ControlClick then you should not be worry to connect to the remote system running the script even if the script is doing his tasks. Kind Regards Alien. Link to comment Share on other sites More sharing options...
Gianni Posted April 7, 2016 Share Posted April 7, 2016 ... If you just need to monitor the sleep() countdown between tasks, then you could use this _VisualSleep() function instead of the normal Sleep() #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> _VisualSleep(90000) ; wait one minute and a half Func _VisualSleep($iDelay, $bAllowEscape = False) Local $hMonitor = GUICreate("Sleeping", 200, 30, -1, -1, -1, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST)) Local $idProgressbar = GUICtrlCreateProgress(0, 0, 200, 30) GUISetState(@SW_SHOW) Local $iTimeElapsed, $iTimeLeft, $iPercentage, $iRefreshTime, $sHHMMSS Local $iTimer = TimerInit() Do Switch GUIGetMsg() ; this also save from cpu overload Case $GUI_EVENT_CLOSE If $bAllowEscape Then ; if True, reset of counter is allowed ExitLoop EndIf EndSwitch $iTimeElapsed = TimerDiff($iTimer) If $iRefreshTime - $iTimeElapsed < 0 Then ; limits refresh rate to 1 second $iRefreshTime = $iTimeElapsed + 1000 $iTimeLeft = ($iDelay - $iTimeElapsed) / 1000 ; in seconds $iPercentage = Int(100 / $iDelay * $iTimeElapsed) GUICtrlSetData($idProgressbar, 100 - $iPercentage) ; progressbar go backwards $sHHMMSS = StringFormat("%02d:%02d:%02d", Floor($iTimeLeft / 3600), Mod(Floor($iTimeLeft / 60), 60), Mod($iTimeLeft, 60)) WinSetTitle($hMonitor, "", $sHHMMSS) ; show countdown on window title EndIf Until $iTimeElapsed >= $iDelay GUIDelete($hMonitor) EndFunc ;==>_VisualSleep p.s. also, have a look to the ProgressOn() and related functions Chimp small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt.... Link to comment Share on other sites More sharing options...
JohnOne Posted April 7, 2016 Share Posted April 7, 2016 Or something much simpler... Func _Sleep($MS) $Timer = TimerInit() While 1 $Diff = TimerDiff($Timer) If $Diff >= $MS Then ToolTip("") Return EndIf ToolTip(Int(($MS - $Diff) / 1000)) ; put this somewhere static Sleep(1000) WEnd EndFunc AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans. Link to comment Share on other sites More sharing options...
mmoalem Posted April 7, 2016 Author Share Posted April 7, 2016 WOW! woke up this morning to this huge list of suggestions! thank U all... have to admit - most of these looks way to complicated in my early stage of learnng this languege but will spend some time studying them and see if i can make one of the work for me... Thank U once more for all the help Link to comment Share on other sites More sharing options...
Bert Posted April 7, 2016 Share Posted April 7, 2016 another suggestion is simply have a separate exe that is the timer to handle the multi-task. I would suggest a system tray icon that changed color depending on the amount of time left. Go from green to yellow to red and have it so you can do a mouse over to check the time. The Vollatran project My blog: http://www.vollysinterestingshit.com/ Link to comment Share on other sites More sharing options...
mmoalem Posted April 7, 2016 Author Share Posted April 7, 2016 OK so managed to both understand and implement what seemed to me the simplest solution from JohnOne 15 hours ago, JohnOne said: Or something much simpler... Func _Sleep($MS) $Timer = TimerInit() While 1 $Diff = TimerDiff($Timer) If $Diff >= $MS Then ToolTip("") Return EndIf ToolTip(Int(($MS - $Diff) / 1000)) ; put this somewhere static Sleep(1000) WEnd EndFunc Now might be a simple question but can I display the time in hours:minutes:seconds? at the moment it seems to show countdown in seconds only... Link to comment Share on other sites More sharing options...
JohnOne Posted April 7, 2016 Share Posted April 7, 2016 I don't see why not. You could just reverse this function, maybe by using Mod() func. AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans. Link to comment Share on other sites More sharing options...
mmoalem Posted April 7, 2016 Author Share Posted April 7, 2016 thanks JohnOne, very kind of you to help so much... I will look at adopting your solution from the other thread but if I may, i have another problem to solve... I would like to log every command after it is executed... I have thousand lines of code so impractical to write a FileWriteLog command after each line... is there a way to use a function at the head of the script to achieve this? I need this because In case windows crash I need to know at what point the script been interrupted... Link to comment Share on other sites More sharing options...
JohnOne Posted April 7, 2016 Share Posted April 7, 2016 (edited) Scite - Tools - Trace add trace lines EDIT: Also consider... Opt("TrayIconDebug", 0) ;0=no info, 1=debug line info Edited April 7, 2016 by JohnOne AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans. Link to comment Share on other sites More sharing options...
mmoalem Posted April 7, 2016 Author Share Posted April 7, 2016 thanks again - I knew about it but couldn't find the option in Tools until I realised now that there is a compact version and an extended version of Scite... anyway - it does exactly what I need except for the output need to be to a file rather than console as if the server crashed I would lose the console records (I think???)... also, I'm not clear how ConsoleWrite works once compiled and run independently from Scite Link to comment Share on other sites More sharing options...
markyrocks Posted April 7, 2016 Share Posted April 7, 2016 (edited) this would be a simple way to log stuff happening ;somthing happened _LogEvent("something happened") func _LogEvent($event) $file=fileopen("log.txt",1) if $file=-1 then msgbox("","","file failed to open") endif filewriteline($file,_Now() & $event) fileclose($file) endfunc untested Edited April 7, 2016 by markyrocks Spoiler "I Believe array math to be potentially fatal, I may be dying from array math poisoning" Link to comment Share on other sites More sharing options...
JohnOne Posted April 7, 2016 Share Posted April 7, 2016 1 hour ago, mmoalem said: thanks again - I knew about it but couldn't find the option in Tools until I realised now that there is a compact version and an extended version of Scite... anyway - it does exactly what I need except for the output need to be to a file rather than console as if the server crashed I would lose the console records (I think???)... also, I'm not clear how ConsoleWrite works once compiled and run independently from Scite Well you user a Regex or a stringreplace on your script to Change ConsoleWrite( to _YourFunction( AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now