Jump to content

Restart a program when it reaches above 1GB of memory


Recommended Posts

Guys, i need help on creating a script that restarts a program once it starts using more than 1GB of memory.

No idea how to start on the script, i don't know which functions i should use for process memory reading.

 

My mind is in total blank at the moment, so i need a kick start :sweating:

Link to post
Share on other sites
On 1/31/2019 at 8:24 PM, argumentum said:

Thank you so much but this is too advanced for me :>

 

On 1/31/2019 at 7:48 PM, Nine said:

look at ProcessGetStats ()  function

Thanks!

I've searched about this function and came up with this script so far for testing:

#include <MsgBoxConstants.au3>

While 1
    $memory = ProcessGetStats("mspaint.exe")
    Sleep(1000)
    call ("check")
    ConsoleWrite($memory[0]/1024&@CRLF)
WEnd

Func check()
If $memory > 30000 Then
   MsgBox($MB_SYSTEMMODAL, "Alert!", "Restart program")
   Exit
EndIf
EndFunc

It reads and writes the correct used memory on the console, however it doesn't detect when it goes over 30000 kilobytes

Edited by ManualIT
Link to post
Share on other sites

@ManualIT

The ProcessGetStats() function returns an array.  In your check() function, you  are referencing $memory (the array) when you should be referencing $memory[0] / 1024

The script below does basically the same thing as what your script was doing, with the correction that I pointed out and a some remarks to help make it clear.  Also note the @error checking.  Coding defensively, in order to catch and handle errors when they occur, will save you a lot of headaches when your scripts get longer and more complex.  If you start the script without MSPaint running, you will get an error message.  Your original script would not have recognized that mspaint wasn't running and just continued on.

#include <Constants.au3>

Global $aMemStats
Global $nMemKB

While 1
    ;Get process' memory stats
    $aMemStats = ProcessGetStats("mspaint.exe")
    If @error Then
        MsgBox($MB_ICONERROR, "ERROR", "Unable to get process stats. Check to make sure mspaint is running.")
        Exit
    EndIf

    ;Convert bytes to kilobytes
    $nMemKB = $aMemStats[0] / 1024

    ;If threshhold exceeded
    If $nMemKB > 30000 Then
        ;Display message and exit
        MsgBox($MB_ICONWARNING, "WARNING", "MSPaint memory limit exceeded!" & @CRLF & "Working set = " & $nMemKB)
        Exit
    EndIf

    ;Wait a second
    Sleep(1000)
WEnd

 

Edited by TheXman
Link to post
Share on other sites

I am Trying to complet this with adding the addition of multiple process with same name.

My video tutorials : ( In construction )  || My Discord : https://discord.gg/S9AnwHw

How to Ask Help ||  UIAutomation From Junkew || WebDriver From Danp2 || And Water's UDFs in the Quote

Spoiler

 Water's UDFs:
Active Directory (NEW 2018-10-19 - Version 1.4.10.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-10-31 - Version 1.3.4.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

Link to post
Share on other sites

@TheXman This should do the trick for me. Why it s not same as my tskmgr ?

 

#include <Constants.au3>
#include <Array.au3>

Global $aMemStats , $aMemStats2 = 0
Global $nMemKB

While 1
    ;Get process' memory stats
    $ProcessName = "Firefox.exe"
    $ProcessList = ProcessList ($ProcessName)
    If @error Then
        MsgBox($MB_ICONERROR, "ERROR", "Unable to get process stats. Check to make sure mspaint is running.")
        Exit
    EndIf
    If IsArray ($ProcessList) Then
       _ArrayDisplay ($ProcessList)
      $iRaws = UBound ( $ProcessList )

       For $i = 0 To $iRaws -1
         $aMemStatsProcessID = ProcessGetStats($ProcessList[$i][1])
         $aMemStatsProcessName = ProcessGetStats($ProcessList[$i][0])

         $aMemStats1 = ProcessGetStats($ProcessList[$i][1])
         $aMemStats2 = $aMemStats2+$aMemStats1[1]
         MsgBox(0,"$aMemStats2",$aMemStats2/ 1024 / 1024 )
       Next
    EndIf

    ;Convert bytes to Mo
    $nMemKB = $aMemStats2 / 1024 / 1024
    MsgBox($MB_ICONWARNING, " Mo",$nMemKB)

    ;If threshhold exceeded
    $Limite = 250
    If $nMemKB > $Limite Then
        ;Display message and exit
        MsgBox($MB_ICONWARNING, "WARNING", "Firefox memory limit (/"&$Limite&" Mo) exceeded!" & @CRLF & "Working set = " & $nMemKB &"/"&$Limite&" Mo" )
        Exit
    EndIf
    ;Wait a second
    Sleep(1000)
WEnd

 

 

Edited by caramen

My video tutorials : ( In construction )  || My Discord : https://discord.gg/S9AnwHw

How to Ask Help ||  UIAutomation From Junkew || WebDriver From Danp2 || And Water's UDFs in the Quote

Spoiler

 Water's UDFs:
Active Directory (NEW 2018-10-19 - Version 1.4.10.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-10-31 - Version 1.3.4.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

Link to post
Share on other sites

Hmmmmmmmmm close

#include <Constants.au3>
#include <Array.au3>

Global $aMemStats1 = 0 , $aMemStats2 = 0
Global $nMemKB

While 1
   $aMemStats1 = 0
   $aMemStats2 = 0
    ;Get process' memory stats
    $ProcessName = ""
    If $ProcessName = "" Then
       $ProcessList = ProcessList ()
        If @error Then
        MsgBox($MB_ICONERROR, "ERROR", "Unable to get process stats. Check to make sure "&$ProcessName&" is running.")
        Exit
    EndIf
    Else
       $ProcessList = ProcessList ($ProcessName)
        If @error Then
        MsgBox($MB_ICONERROR, "ERROR", "Unable to get process stats. Check to make sure "&$ProcessName&" is running.")
        Exit
    EndIf
    EndIf
    If IsArray ($ProcessList) Then
       _ArrayDisplay ($ProcessList)
      $iRaws = UBound ( $ProcessList )

       For $i = 1 To $iRaws -1
         $aMemStatsProcessID = ProcessGetStats($ProcessList[$i][1])
         $aMemStatsProcessName = ProcessGetStats($ProcessList[$i][0])

         $aMemStats1 = ProcessGetStats($ProcessList[$i][1])
         If IsArray ($aMemStats1) Then
         $Message = $aMemStats1[1]
         $ProcessName = $ProcessList[$i][0]
         ;MsgBox($MB_ICONWARNING,"Addition", $Message&" "&$ProcessName&" PID:" &$ProcessList[$i][1] )
         $Message &=' + '
         $Message &= $aMemStats2
         $Message &= ' = '
         $Message &= $aMemStats1[1]+$aMemStats2
         ;MsgBox(0,"Addition", $Message )
         $aMemStats2 = $aMemStats2+$aMemStats1[1]
         ;MsgBox(0,"$aMemStats2",$aMemStats2)
         EndIf
       Next
    EndIf

    ;Convert bytes to Mo
    $nMemKB = $aMemStats2 / 8388608
    $nMemKB = Round($nMemKB ,0)
    ;$nMemKB = $aMemStats2 / 1048576
    $Message = $aMemStats2&'b / 8388608b(=1Mo) ='&$nMemKB&' Mo'
    MsgBox($MB_ICONWARNING, "b / Mo",$Message)

    ;If threshhold exceeded
    $Limite = 4300
    If $nMemKB > $Limite Then
        ;Display message and exit
        MsgBox($MB_ICONWARNING, "WARNING", "Firefox memory limit (/"&$Limite&" Mo) exceeded!" & @CRLF & "Working set = " & $nMemKB &"/"&$Limite&" Mo" )
        Exit
    EndIf
    ;Wait a second
    Sleep(1000)
WEnd

 

Edited by caramen

My video tutorials : ( In construction )  || My Discord : https://discord.gg/S9AnwHw

How to Ask Help ||  UIAutomation From Junkew || WebDriver From Danp2 || And Water's UDFs in the Quote

Spoiler

 Water's UDFs:
Active Directory (NEW 2018-10-19 - Version 1.4.10.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-10-31 - Version 1.3.4.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

Link to post
Share on other sites
4 hours ago, caramen said:

Why it s not same as my tskmgr ?

I have to assume that you are asking why doesn't your calculated "working set" memory, in megabytes, match what's displayed in your task manager.  If that's true, what is the heading title of the memory column that you are looking at in the task manager?  Is it "Working Set (memory)"?  If it is not, then change it to "Working Set (memory)" and see if it matches.

 

Edited by TheXman
Link to post
Share on other sites

image.png.b7624460c1094787c638526a2fe0bc04.png

My video tutorials : ( In construction )  || My Discord : https://discord.gg/S9AnwHw

How to Ask Help ||  UIAutomation From Junkew || WebDriver From Danp2 || And Water's UDFs in the Quote

Spoiler

 Water's UDFs:
Active Directory (NEW 2018-10-19 - Version 1.4.10.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-10-31 - Version 1.3.4.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

Link to post
Share on other sites

@caramen

#include <Constants.au3>
#include <Array.au3>

Const $PROCESS_NAME  = "firefox.exe"
Const $MB_LIMIT      = 250

Global $aMemStats , $aProcessList
Global $nMemKB, $nMemMB

While 1
    ;Get process list
    $aProcessList = ProcessList ($PROCESS_NAME)
    If Not IsArray($aProcessList) Or $aProcessList[0][0] = 0 Then
        MsgBox($MB_ICONERROR, "ERROR", StringFormat('Unable to get process list for "%s".', $PROCESS_NAME))
        Exit
    EndIf

    ;Calculate total kb of processes
    $nMemKB = 0
    For $i = 1 To $aProcessList[0][0]
        $aMemStats = ProcessGetStats($aProcessList[$i][1])
        $nMemKB += ($aMemStats[0] / 1024)
    Next

    ;Convert bytes kb to mb
    $nMemMB = $nMemKB / 1024

    ConsoleWrite(StringFormat("Total KB = %i", $nMemKB) & @CRLF)
    ConsoleWrite(StringFormat("Total MB = %i", $nMemMB) & @CRLF)

    ;If threshhold exceeded
    If $nMemMB > $MB_LIMIT Then
        ;Display message and exit
        MsgBox($MB_ICONWARNING, "WARNING", _
            StringFormat("Firefox memory limit exceeded.\nActual MB = %i\nLimit MB = %i", $nMemMB, $MB_LIMIT) _
        )
        Exit
    EndIf

    ;Wait a second
    Sleep(1000)
WEnd

 

Edited by TheXman
Fixed a typo
Link to post
Share on other sites

nice

My video tutorials : ( In construction )  || My Discord : https://discord.gg/S9AnwHw

How to Ask Help ||  UIAutomation From Junkew || WebDriver From Danp2 || And Water's UDFs in the Quote

Spoiler

 Water's UDFs:
Active Directory (NEW 2018-10-19 - Version 1.4.10.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-10-31 - Version 1.3.4.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Chimp
      After watching this movie (https://www.youtube.com/watch?v=cPiDHXtM0VA) I wanted to try the test to see how much i could compete with that chimpanzee so i created this script.
      well, actually passing that test is a lot harder than it sounds. With the difficulty set to seven numbers and a display time of one second, I can only remember 2 or 3 numbers ... (what a disappointment)
      I can only do better if I reduce the slider to 5 numbers and increase the storage time to 2 seconds (the easyest level), a very poor performance. That chimpanzee is great.
      The script offers you a sequence of 10 random quizzes. At the end it gives you the percentage of your "level". The chimpanzee resolves on average 8 out of 10 (80%), so you can compare your performance to that of the chimpanzee.
      How to play:
      Run the script. At the beginning there are 2 sliders at the bottom of the screen where you can set the difficulty level by varying the memorization time and the amount of numbers to memorize as you like. After setting the difficulty, click the circle on the bottom left to get started. after the first move the sliders are no longer displayed until the next game, (the game lasts 10 attempts, there is a progress bar at the bottom of the screen to see where you are) between one test and the other of the ten, click on the circle to move on to the next test have fun.
      (here a related interesting video: https://www.youtube.com/watch?v=ktkjUjcZid0 )
      #include <GUIConstants.au3> #include <MsgBoxConstants.au3> #include <Array.au3> #include <WinAPIMisc.au3> ; HotKeySet("{ESC}", "_EndOfGame") Global $iNumbersToGuess = 7, $iExpositionTime = 1000, $iMatches = 10, $iMatchesWon Global $aNumbers[10] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Global $aButtons[10], $aControls[5] Global $iWinWidth = @DesktopWidth / 2, $iWinHeight = @DesktopHeight / 2, $iButtonXSide = Int($iWinWidth / UBound($aNumbers)), $iButtonYSide = Int($iWinHeight / UBound($aNumbers)), $sWinTitle = "Beat the Chimp" Global $aX[Int($iWinWidth / $iButtonXSide)], $aY[Int($iWinHeight / $iButtonYSide)], $iNdx = 0, $aPoints[3], $score, $GUIGetMsg, $iDockHeight = 50, $iProgrssHeight = 5 For $i = 0 To (Int($iWinWidth / $iButtonXSide) - 1) * $iButtonXSide Step $iButtonXSide $aX[$iNdx] = $i $iNdx += 1 Next $iNdx = 0 For $i = 0 To (Int($iWinHeight / $iButtonYSide) - 1) * $iButtonYSide Step $iButtonYSide $aY[$iNdx] = $i $iNdx += 1 Next Global Const $iDockLeftBorder = 200, $iForeColor = 0xFFFFFF, $iBackColor = 0x000000 Global $hGUI = GUICreate($sWinTitle, $iWinWidth, $iWinHeight + $iDockHeight + $iProgrssHeight, @DesktopWidth / 4, @DesktopHeight / 5) GUISetBkColor($iBackColor, $hGUI) ; the circle to continue playing $aControls[0] = GUICtrlCreateLabel(ChrW(0x25EF), 0, $iWinHeight + 1, 100, $iDockHeight, 0x01) ; GUICtrlSetTip(-1, "Click the circle," & @CRLF & "then click the squares" & @CRLF & "in numeric order.") GUICtrlSetFont(-1, 24, 900) GUICtrlSetColor(-1, $iForeColor) GUICtrlSetBkColor(-1, $iBackColor) ; slider for the amount of numbers to guess $aControls[2] = GUICtrlCreateSlider($iDockLeftBorder, $iWinHeight, $iWinWidth - $iDockLeftBorder, Int($iDockHeight / 2)) GUICtrlSetLimit(-1, 10, 5) ; 5 steps 5 (easy) to 10 (hard) GUICtrlSetData(-1, $iNumbersToGuess) ; label for the amount of quizzes $aControls[1] = GUICtrlCreateLabel("Numbers : " & GUICtrlRead($aControls[2]), 100, $iWinHeight + 1, 100) GUICtrlSetColor(-1, $iForeColor) ; slider for the exposition time $aControls[4] = GUICtrlCreateSlider($iDockLeftBorder, $iWinHeight + (Int($iDockHeight / 2)), $iWinWidth - $iDockLeftBorder, $iDockHeight / 2) GUICtrlSetLimit(-1, 8, 1) ; 8 steps (0f 250ms each) GUICtrlSetData(-1, $iExpositionTime / 250) ; label for the exposition time $aControls[3] = GUICtrlCreateLabel("ms to show : " & GUICtrlRead($aControls[4]) * 250, 100, $iWinHeight + 1 + (Int($iDockHeight / 2)), 100) GUICtrlSetColor(-1, $iForeColor) ; progress bar of the match Global $idProgressbar = GUICtrlCreateProgress(0, $iWinHeight + $iDockHeight, $iWinWidth, $iProgrssHeight) ; Create buttons For $i = 0 To 9 $aButtons[$i] = GUICtrlCreateLabel($i + 1, $iWinWidth + 5, $iWinHeight + $iDockHeight + $iProgrssHeight + 5, $iButtonXSide, $iButtonYSide, 0x01) GUICtrlSetFont($aButtons[$i], 24) GUICtrlSetColor($aButtons[$i], $iForeColor) GUICtrlSetBkColor($aButtons[$i], $iBackColor) Next GUISetState(@SW_SHOW) ; --- Main loop --- Do ; New game $iMatchesWon = 0 GUICtrlSetData($idProgressbar, 0) For $iRound = 1 To $iMatches ; the game lasts $iMatches rounds $iNdx = 0 ; reset pointer (index to the next correct answer) _HideControls(__get_IDs_by_indexes($aButtons, $aNumbers)) ; remove the numbers from the screen ; show the dock and wait (only in the first round are also shown the sliders) _ShowControls($iRound = 1 ? $aControls : $aControls[0]) ; display the dock's control(s) While 1 Switch GUIGetMsg() Case $aControls[0] ; The circle (play a new quiz) ExitLoop Case $aControls[2] ; slider to choose how many numbers to guess $iNumbersToGuess = GUICtrlRead($aControls[2]) GUICtrlSetData($aControls[1], "Numbers : " & $iNumbersToGuess) Case $aControls[4] ; slider to choose how long (milliseconds) to show the numbers $iExpositionTime = GUICtrlRead($aControls[4]) * 250 ; 8 steps of 250 milliseconds each GUICtrlSetData($aControls[3], "ms to show : " & $iExpositionTime) Case $GUI_EVENT_CLOSE _EndOfGame() EndSwitch WEnd _HideControls($aControls) ; hide the dock Sleep(750) ; wait a bit $aQuiz = _GenerateQuiz($iNumbersToGuess) ; generate random elements to guess _SpreadControls(__get_IDs_by_indexes($aButtons, $aQuiz)) ; scatter the numbers on the GUI _ShowControls(__get_IDs_by_indexes($aButtons, $aQuiz)) ; display the numbers Sleep($iExpositionTime) ; leave numbers visible for a short time _MaskControls(__get_IDs_by_indexes($aButtons, $aQuiz)) ; mask the numbers GUICtrlSetData($idProgressbar, Round($iRound / $iMatches * 100)) ; _ShowControls(__get_IDs_by_indexes($aButtons, $aQuiz)) ; <------------- keep numbers visible FOR DEBUG PURPOSE ONLY! While 1 ; wait for a move $GUIGetMsg = GUIGetMsg() If $GUIGetMsg = $GUI_EVENT_CLOSE Then _EndOfGame() ; scan all quiz buttons to check if one was pressed For $i = 0 To UBound($aQuiz) - 1 ; $aButtons) - 1 If $GUIGetMsg = $aButtons[$aQuiz[$i] - 1] Then If $i = $iNdx Then ; -------------------------- ; actions for a right move ; -------------------------- ; hide the guessed number _HideControls($aButtons[$aQuiz[$i] - 1]) ; --------------------------------- ; check if this round is complete ; --------------------------------- If $iNdx = (UBound($aQuiz) - 1) Then _WinAPI_PlaySound("SystemExclamation", Null, BitOR($SND_ALIAS, $SND_ASYNC)) $iMatchesWon += 1 ExitLoop 2 EndIf ; play a short ok sound ; _WinAPI_PlaySound("FaxBeep", Null, BitOR($SND_ALIAS, $SND_ASYNC)) ; "SystemAsterisk" $iNdx += 1 ; set index to next correct answer Else ; -------------------------- ; actions for a wrong move ; -------------------------- ; show all the right sequence _ShowControls(__get_IDs_by_indexes($aButtons, $aQuiz)) _WinAPI_PlaySound("DeviceFail", Null, BitOR($SND_ALIAS, $SND_ASYNC)) ; give a little time to the user to control it Sleep(1500) ; go to next step ExitLoop 2 EndIf EndIf Next WEnd ; loop till end of match $score = Round($iMatchesWon / $iMatches * 100, 2) ; percentage Select Case $score < 80 $sResult = "The chimp beat you!" Case $score > 80 $sResult = "You beat the chimp!" Case $score = 80 $sResult = "You tied the chimp." EndSelect Next ; next round ; game over? Until MsgBox($MB_YESNO + $MB_ICONINFORMATION + $MB_TASKMODAL + $MB_SETFOREGROUND, _ "Game over", _ "You got " & $score & "% correct." & @CRLF & _ "Ayumu averages 80% correct." & @CRLF & $sResult & @CRLF & @CRLF & _ "do you want to try again?") <> 6 Func _SpreadControls($aTemp) ; place the required numbers scattered on the GUI SRandom(@YEAR + @MON + @MDAY + @HOUR + @MIN + @SEC) _ArrayShuffle($aX) _ArrayShuffle($aY) ; first, place all buttons out of GUI For $i = 0 To UBound($aButtons) - 1 GUICtrlSetPos($aButtons[$i], $iWinWidth + 5, $iWinHeight + $iDockHeight + $iProgrssHeight + 5) GUICtrlSetState($aButtons[$i], $GUI_DISABLE) Next ; Then place only the numbers of this quiz in visible area For $i = 0 To UBound($aTemp) - 1 GUICtrlSetPos($aTemp[$i], $aX[$i], $aY[$i]) GUICtrlSetState($aTemp[$i], $GUI_ENABLE) Next EndFunc ;==>_SpreadControls Func _GenerateQuiz($iNumElements) ; generate an array of required random numbers SRandom(@YEAR + @MON + @MDAY + @HOUR + @MIN + @SEC) Local $aTemp[$iNumElements] _ArrayShuffle($aNumbers) For $i = 0 To $iNumElements - 1 $aTemp[$i] = $aNumbers[$i] Next _ArraySort($aTemp) Return $aTemp EndFunc ;==>_GenerateQuiz Func _ShowControls($aTemp) ; render controls visible (and enabled) $aTemp = _EnforceArray($aTemp) For $i = 0 To UBound($aTemp) - 1 GUICtrlSetState($aTemp[$i], $GUI_SHOW) GUICtrlSetColor($aTemp[$i], $iForeColor) GUICtrlSetBkColor($aTemp[$i], $iBackColor) Next EndFunc ;==>_ShowControls Func _MaskControls($aTemp) ; mask the controls $aTemp = _EnforceArray($aTemp) For $i = 0 To UBound($aTemp) - 1 GUICtrlSetColor($aTemp[$i], $iForeColor) GUICtrlSetBkColor($aTemp[$i], $iForeColor) Next EndFunc ;==>_MaskControls Func _HideControls($aTemp) ; hide the controls (implies disable) $aTemp = _EnforceArray($aTemp) For $i = 0 To UBound($aTemp) - 1 GUICtrlSetState($aTemp[$i], $GUI_HIDE) ; $GUI_DISABLE) ; GUICtrlSetColor($aButtons[$aTemp[$i] - 1], $iBackColor) ; GUICtrlSetBkColor($aButtons[$aTemp[$i] - 1], $iBackColor) Next EndFunc ;==>_HideControls Func _EnforceArray($vParam) ; if only one value is passed, turn it into an array of only 1 element If Not IsArray($vParam) Then Local $aTemp[1] = [$vParam] Return $aTemp EndIf Return $vParam EndFunc ;==>_EnforceArray Func __get_IDs_by_indexes(ByRef $aCtrls, ByRef $aNdxs) ; returns the handles of the controls pointed to by the indexes Local $aTemp[UBound($aNdxs)] For $i = 0 To UBound($aNdxs) - 1 $aTemp[$i] = $aCtrls[$aNdxs[$i] - 1] Next Return $aTemp EndFunc ;==>__get_IDs_by_indexes Func _EndOfGame() ; _WinAPI_PlaySound ("SystemExit" , Null, $SND_ALIAS) GUIDelete() Exit EndFunc ;==>_EndOfGame P.S. At this link (https://web.archive.org/web/20131006161544/http://games.lumosity.com/chimp.html) there is a Flash version of this game.
    • By SteveJM
      When I use DllStructCreate() to reserve a chunk of memory I would like to know if I can rely on that memory being initialized to zero. Experience suggests that it is, but I have been searching to try and find a definitive statement anywhere that this is the case. I apologise if I have missed somewhere. Part of the reason for this question is so that my next search (after my personal memory has dimmed) should yield a link to this post, hopefully with an answer.
      A number of DLLs I use have structs where a few parts have to be explicitly set and other parts are reserved with the instruction that they must be set to zero. Because DllStructCreate() appears to zero-initialise the memory, I tend to forget to do it explicitly and everything seems to work. I am wondering whether I have been lucky and am storing up trouble for myself. It seems likely that the OS has been asked for zeroed memory, but without a promise in the documentation for DllStructCreate(),  perhaps that could change? Perhaps the developers wish to reserve the right to change their minds?
    • By Pricehacker
      Hello!
      Im wondering if it is possible to 'empty' the variable value to save memory, for example i often use variable as a onetime use thing and would prefer to 'forget' it after is is used
      Maybe it is just as easy as to setting $vVar = Null, but i wanted to make sure that this is the case
    • By CarlD
      Is there a reliable way to ensure that data assigned to variables in a script is overwritten or deleted when the script exits? I have scripts that encrypt/decrypt data and would like to ensure, if possible, that the encryption keys and decrypted data do not stay in memory after the script exits. Thanks.
    • By Tersion
      Here test example of a dummy program with random added controls to the main form:
      If #include <GuiListView.au3> is commented out, then this simple program uses around 3,5 MB of RAM. When #include <GuiListView.au3> NOT commented out - RAM usage is around 13-14 MB.
      How can I reduce memory usage? Even if I'm not using GuiListView.au3 - 3,5 MB quite a bit for a such dummy program!
      I found out that using this DLLCall in main loop:
      DllCall("psapi.dll", "int", "EmptyWorkingSet", "long", -1) Significantly reduces RAM usage (even with GuiListView.au3 included, from 13-14 MB to 600 KB !!! ) but I'm not sure if it's doesn't have any impact to common workflow of a program...
      So, give me any advice about that, please.
×
×
  • Create New...