Sign in to follow this  
Followers 0
Recoveryelf

How to free memory used by FileSave/OpenDialog?

23 posts in this topic

Anytime I use FileOpenDialog or FileSaveDialog there is a 6k jump in memory that does not get cleared upon dialog close.

Here is a screenie of my project.

Posted Image

Here is example code with sections removed.

; Includes
#include 
#include 

; Initialize Global Variables
Global $Error = 1
Global $FileMenuNew
Global $FileMenuCtrl
Global $FileMenuExit
Global $FileMenuLineBreak
Global $FileMenuOpen
Global $FileMenuOptions
Global $FileMenuSave
Global $FileMenuSaveAs
Global $MainWindowInput
Global $MainWindowHandle
Global $MainWindowOpenButton
Global $NewAttempt
Global $OpenAttempt
Global $Terminate = 1
Global $WindowHeight = @DesktopHeight * 0.5
Global $WindowTitle = "Iron Manager"
Global $WindowWidth = @DesktopWidth * 0.5
Global $WorkingFileHandle
Global $WorkingFileName

; Initialize Main GUI
CreateMainWindow()

; Main Loop
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $FileMenuExit
$Terminate = 0
ExitLoop
Case $FileMenuNew
$NewAttempt = FileSaveDialog("New Database...", @WorkingDir & "\", _
"Database File (*.dbx)", (2 + 16), "New Database", $MainWindowHandle)
Case $FileMenuOpen, $MainWindowOpenButton
$OpenAttempt = FileOpenDialog("Open Database...", @WorkingDir & "\" , _
"Database File (*.dbx)", (1 + 2 + 8), "", $MainWindowHandle)
EndSwitch
If $Terminate = 0 Then ExitLoop
WEnd

; Clean Up
GUIDelete($MainWindowHandle)
Exit

Func CreateMainWindow()
$MainWindowHandle = GUICreate($WindowTitle, $WindowWidth, _
$WindowHeight, (@DesktopWidth * 0.25), (@DesktopHeight * 0.25))
$FileMenuCtrl = GUICtrlCreateMenu("File")
$FileMenuNew = GUICtrlCreateMenuItem("New", $FileMenuCtrl, 0, 0)
$FileMenuOpen = GUICtrlCreateMenuItem("Open...", $FileMenuCtrl, 1, 0)
$FileMenuSave = GUICtrlCreateMenuItem("Save", $FileMenuCtrl, 2, 0)
$FileMenuSaveAs = GUICtrlCreateMenuItem("Save As...", $FileMenuCtrl, 3, 0)
$FileMenuLineBreak = GUICtrlCreateMenuItem("", $FileMenuCtrl, 4, 0)
$FileMenuOptions = GUICtrlCreateMenuItem("Settings", $FileMenuCtrl, 5, 0)
$FileMenuExit = GUICtrlCreateMenuItem("Exit", $FileMenuCtrl, 6, 0)
$MainWindowInput = GUICtrlCreateInput("", ($WindowWidth * 0.02), _
($WindowHeight * 0.025), ($WindowWidth * 0.85), ($WindowHeight * 0.04))
$MainWindowOpenButton = GUICtrlCreateButton("Open...", _
($WindowWidth * 0.885), ($WindowHeight * 0.02225), ($WindowWidth * 0.1), ($WindowHeight * 0.045))
GUISetState(@SW_SHOW, $MainWindowHandle)
EndFunc ;==>CreateFirstWindow

Help anyone?

~Recoveryelf

Share this post


Link to post
Share on other sites



Search for ReduceMemory Function

By curiosity what's Iron Manager ? is there a link with Srware Iron browser ?


AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites

There is no link. It's a Data Manager I'm writing for a non-profit. Everything except the encryption engine will be open source when it's finished.

~Recoveryelf

Share this post


Link to post
Share on other sites

6K? How much memory does your machine have? Why bother?


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

What version of AutoIt are you using? There was a bug in versions prior to 3.3.7.0 with FileOpen and the memory consumption of using it.


If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Share this post


Link to post
Share on other sites

#6 ·  Posted (edited)

I've already done tests to find out that it's not FileOpen, but any of the FileOpen/Save dialogs do cause the memory spike. I'm a traditional programmer so I want my applications to be as small as possible and do run memory tests on every feature. The goal is to create a program that runs as fast and efficent as possible. I know I'm asking a lot out of an automated language but 6k on a dialog box could turn into much more in the size of this project. I'm using v3.3.8.1. My machine has 6gb. But 6k is not something to scoff at, IMHO.

Edit:

Just not enough time to do it with a low-level language and do not want java as a requirement. Must be a standalone exe.

~Recoveryelf

Edited by Recoveryelf

Share this post


Link to post
Share on other sites

From the code you posted I didn't get the impression that this is a 7x24 service script. So the 6k wouldn't sum up to a big amount of "lost" storage causing problems.

I'm an old mainframe programmer and started with 36k of core memory. We had to carefully use the memory we had. But nowadays I wouldn't invest too much time in searching the reason for this lost memory.

Just my 0.02$


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

Still... it is a bug.

Share this post


Link to post
Share on other sites

Still... it is a bug.

Have you tested just using FileOpenDialog or FileSaveDialog alone? If there is no jump then there is no bug with those functions.

_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 04/09/2015

Share this post


Link to post
Share on other sites

Yes, I have. FileOpenDialog and FileSaveDialog both do the same thing. Also, for every use of the dialog it adds 200kb memory which does not free.

Share this post


Link to post
Share on other sites

Are you sure it's an AutoIt problem and not a Windows problem? Have you done any testing using something similar in another language and watching the memory usage?


If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Share this post


Link to post
Share on other sites

#12 ·  Posted (edited)

;I think this function was written by god.
Func _ReduceMemory($i_PID = -1);I use this function to greatly reduce the amount of memory Runner absorbs.
    if $i_PID <> -1 then
        local $ai_Handle = dllcall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $i_PID)
        $ai_return = dllcall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', $ai_Handle[0])
        dllcall('kernel32.dll', 'int', 'CloseHandle', 'int', $ai_Handle[0])
    else
        $ai_return = dllcall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', -1)
    Endif
    return $ai_return[0]
EndFunc   ;==>_ReduceMemory

Does calling the _reducememory() function after the dialog calls free the memory? If you run it in a loop (which I may test) how far does the leak go? Does it tapper off, leak forever into virtual memory, or what?

writing a test
Edited by Xandy

Share this post


Link to post
Share on other sites

Anytime I use FileOpenDialog or FileSaveDialog there is a 6k jump in memory that does not get cleared upon dialog close.

By 6k do you mean the difference between 2,680 k to 8,516 k from the screenshot posted on your first post?

If yes, then it is not 6k but 6 megabyte.

When I run the following compiled test script I get 2,168 K at the start and 7,040 K after the FileOpenDialog.

msgbox(0, "Test", "Start ...")
FileOpenDialog("Titel","","")
For me it's Windows using the memory.

BTW: I'm running Windows 7 64 bit.


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

Two scripts

script 1: makes a dialog in a loop

script 2: sends escape to dialog to aquire next dialog in loop

choose and compile one, on first test I did not see any memory increase maybe I need to choose a file idk

;////// test dialog to test the dialog
#include <misc.au3>;give me _ispressed()
#include <GUIConstantsEx.au3>;give me $gui_event_close
$hgui= guicreate("I test", 320, 200)
guisetstate()
do
$msg= guigetmsg()
$loadname = fileopendialog("Unique fileopendialog test", @scriptdir, "", "", $hgui)
until $msg= $gui_event_close

Func _ReduceMemory($i_PID = -1); I use this function to greatly reduce the amount of memory Runner absorbs.  I think this functin was written by god.
    if $i_PID <> -1 then
        local $ai_Handle = dllcall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $i_PID)
        $ai_return = dllcall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', $ai_Handle[0])
        dllcall('kernel32.dll', 'int', 'CloseHandle', 'int', $ai_Handle[0])
    else
        $ai_return = dllcall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', -1)
    Endif
    return $ai_return[0]
EndFunc   ;==>_ReduceMemory

#include <misc.au3>;give me _ispressed()
#include <GUIConstantsEx.au3>;give me $gui_event_close
$hgui= guicreate("I send keys at test", 320, 200)
guisetstate()
do
       $msg= guigetmsg()
       $list = winlist("Unique fileopendialog test")
       if $list[0][0]> 0 then
              controlsend($list[1][1], "", 0, "{ESC}")
       endif;endif list> 0
until $msg= $gui_event_close

Share this post


Link to post
Share on other sites

When we talk about memory, which of the 7 values the task manager offers do we talk about?


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

This would appear to be a windows issue. I just tried opening the file open dialog and then clicking the cancel button and repeating the process about 20 to 30 time manually i.e. not using AutoIt in several different applications and for each of them the memory in use increased every time the file open dialog was activated. Not enough to give me any concern as I can not envisage a situation where I would be using the file open dialog hundreds of times.

This was on a Windows 7 pro system with 32 GB RAM.


"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to build bigger and better idiots. So far, the universe is winning."- Rick Cook

Share this post


Link to post
Share on other sites

C++ GetOpenFileName memory usage

http://social.msdn.microsoft.com/Forums/en/vclanguage/thread/6e30c3fd-fbe2-4f2d-8f7c-171f31cae04a

As pointed out in that forum, the system shell code causes this.

I might add that there are GDI/USER object and handle leaks as well.

If this is an issue, I suggest launching the FileOpen dialog as a separate process

and get the return data using inter-process communication, i.e. WM_COPYDATA, mailslots, etc.


I see fascists...

Share this post


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
Sign in to follow this  
Followers 0