Earthshine Posted March 27, 2018 Posted March 27, 2018 AutoIt is an interpreted language. If you want high performance, go with a compiled .NET language or C/C++ My resources are limited. You must ask the right questions
Fenzik Posted April 17, 2020 Posted April 17, 2020 Hello All, I'm sorry for replying in to relative old thread, but the situation discussed here is the same till now. We Discussed slow gui performance with Screen readers in combination with Gui Concept. During my last testing of that, i noticed following summary: The performance is the same, regardless of value in Sleep function used in GuiOnEvent Loop (Sleep(10) is the same as for example Sleep(1000)). The process priority of running script [ also don't have any effect. This behaviour is actual from autoit version 3. 3. 12. 0. In previous release 3. 3. 10. 0 was gui performance with screen readers as normal as in other applications. Gui performance is totaly fast, when the On Event mode loop is empty. I know that it's not good practice, cause the CPU is redundantly throttled, but i'm teling it here just for info. So, can developers of Autoit check behaviour of Sleep function in context with processing of gui events inside of Autoit. I think that slow gui performance with screen readers is directly related with implementation of Sleep function in conjunction with processing of Gui inside Autoit.
Developers Jos Posted April 17, 2020 Developers Posted April 17, 2020 Don't think your story is related at all to this thread as that doesn't talk about GuiOnEvent() but rather GUIGetMsg() with its 10ms sleep build in. Any replicator script you can share to show the issue you have? Jos SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past.
Fenzik Posted April 17, 2020 Posted April 17, 2020 Replicator scripts are written by Darking on the first page of this thread. If you let the gui loop empty, the performance of Screen reader (Link also on the first page) is totaly fast. It's not so big issue, but for Screen reader users and visualy impaired programers, the autoit is very nice language. And when the controls are native Win32, it would be fine to have created guis also nice and fast as much as possible. .)
Developers Jos Posted April 17, 2020 Developers Posted April 17, 2020 ... yes and you have seen my answer? It is/was working fine for me so it is hard to figure out an issue when it's not showing up for us. Any idea what the specific condition might be that triggers this slowness, because I do not think we figured that out previously in this thread, unless I missed it? Jos SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past.
Fenzik Posted April 17, 2020 Posted April 17, 2020 Yes, i understand, that it's hard to reproduce it. But. If you use for example variant of script with on event mode and let the loop empty, without the Sleep function, you notice, that performance of gui with Screen reader is very fast. But if you set the Sleep to some value doesn(t matter if 10, 100 or 1000, the gui becomes to be more slower than before. I think that this behaviour is not typical. I understand, that High CPU usage without a Sleep can reserve more resources and fast performance of gui with Screen reader can be only side effect of this. But it must be somethink else, because this changed between two autoit versions. I was read the version history, but unfortunately there is nothing related to this. I love autoit so much and only think why i'm trying to solve this is my effort to have Autoit as powerfull as possible also for visualy impaired users.. Thank you for your quick replyes.. Fenzik
Fenzik Posted April 18, 2020 Posted April 18, 2020 So, i found a best way to demonstrate slow Gui performance at all... When you turn on Autoit 3 wrapper Gui tool with Screen reader also turned on, you can notice, that manipulating with this tool is slow. It's also noticeable when you switch to the Wrapper gui from another window. Fenzik
Mateocedillo Posted May 31, 2021 Posted May 31, 2021 Hello. I am one of the witnesses that you notice a lag with gui screen readers. Currently developing software, I found a solution that is the OnEventMode but it is giving me problems that I did not have with the GuiGetMSG () This does not depend on the computer or the hardware, as the users said. This depends on the milliseconds of waiting that is predefined in the GuiGetMSG (), in addition, the delay is very evident in any Windows PC, be it powerful, high or low resources because I have already done my tests and everything is the same . I would strongly suggest that in version 3.3.16.0 or in the next beta you change the milliseconds of guiGetMsg, which by default has 10, but it should be changed to 0 and once it is changed it is very likely that the gui will even behave much faster with screen readers, or that ultimately that function is part of a UDF and that in the GuiGetMsg function an optional variable is created where the user chooses the number of milliseconds, for example. #include <GUIConstantsEx.au3> $hGUI = GUICreate("Gui Example") $button1 = GUICtrlCreateButton("Button 1", 50, 25, 50, 25) $button2 = GUICtrlCreateButton("Button 1", 90, 25, 50, 25) GUISetState(@SW_SHOW, $hGUI) $GuiMSG = GuiGetMsg($milliseconds = 0) While 1 Switch $GuiMSG Case $GUI_EVENT_CLOSE, $Button2 ExitLoop Case $Button1 MsgBox(0, "Information", "you have pressed button 1") EndSwitch WEnd ; If it were possible to modify the milliseconds of GuiGetMsg to 0, and if there was a hope of doing it, you can see a gui quite fast like all standard Windows programs or some custom graphical interface such as WX with Python with how fast it is . I think the only solution I can find is by modifying the milliseconds of the aforementioned function. There is the GuiEventMode solution, but it can bring failures on some occasions. Finally I come to the conclusion that for now you have to get used to this slowness of the gui until they reduce the number of milliseconds of GuiGetMSG, for users with screen readers.
Developers Jos Posted June 1, 2021 Developers Posted June 1, 2021 13 hours ago, Mateocedillo said: Finally I come to the conclusion that for now you have to get used to this slowness of the gui until they reduce the number of milliseconds of GuiGetMSG, for users with screen readers. I've tried to understand what it is you are trying to tell us but it is unclear why the 10 ms is an real issue and why the Eventmode is not working for you, which really should the the solution to give complete control. So show me an script where you demonstrate that the EventMode is giving issues. Jos SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past.
Mateocedillo Posted June 1, 2021 Posted June 1, 2021 (edited) 5 hours ago, Jos said: I've tried to understand what it is you are trying to tell us but it is unclear why the 10 ms is an real issue and why the Eventmode is not working for you, which really should the the solution to give complete control. So show me an script where you demonstrate that the EventMode is giving issues. Jos What happens is that the 10 ms that are inside the GuiGetMSG and the GuiGetMSG inside the While causes it to generate this delay. Next I am going to show a part of a code from one of my programs, it is a part that I migrated to the EventMode and it has an error when going to the "options" submenu, so the script closes abruptly, but I think I have to pass the complete code so that you understand things better. expandcollapse popup;Mini Calendar: ;include #include <AutoItConstants.au3> #include <ComboConstants.au3> #include "include\desencriptador.au3" #include <EditConstants.au3> #include <fileConstants.au3> #include <guiConstantsEx.au3> #include <include\reader.au3> #include "include\options.au3" #include <include\sapi.au3> #include <misc.au3> #include <include\NVDAControllerClient.au3> #include <include\kbc.au3> #include <include\menu_nvda.au3> #include <TrayConstants.au3> #include "updater.au3" #include <WindowsConstants.au3> ;#include "include\zip.au3" Opt("GUIOnEventMode", 1) Func principal() If @Compiled Then FileDelete("MCWeb.dat") EndIf $slanguage = IniRead("config\config.st", "General settings", "language", "") Global $program_ver = 0.3 SoundPlay(@TempDir & "\sounds\soundsdata.dat\open.mp3", 1) $Gui_main = GUICreate("Mini calendar " & $program_ver) HotKeySet("{F1}", "playhelp") Global $programname = "Mini Calendar" ;Translatable items: Select Case $slanguage = "es" $mensaje12 = "Pulsa alt para abrir el menú." $mensaje13 = "&Salir" $menu1 = "Agendar..." $menu1a = "Opciones de Mini Calendario..." $menu2 = "Salir" $menu3 = "Ayuda" $menu4 = "&Manual de usuario" $menu4a = "Cambios" $menu5 = "Acerca de Mini Calendar" $menu6 = "Reportero de errores..." $menu7 = "Opciones" $menu8 = "Visitar sitio web" Global $recordar1 = "Agenda programada" Global $recordar2 = "Te recordamos que tienes que hacer " Global $recordar3 = "Recuerda que tienes una agenda programada ya mismo. " Global $recordar4 = "Prepárate para poner en marcha tus rutinas diarias a buen pie. " Global $recordar5 = "Es hora de realizar esta actividad " Global $recordar6 = "Buen ánimo, buena suerte y buena vibra para todo lo que propongas realizar " Global $recordar7 = "Esperemos que la siguiente actividad que hagas sea un éxito " Global $recordar8 = "Es hora de dejar el descanso y reanudar tu día con la siguiente actividad: " Global $recordar9 = "Buena suerte para esto, " & @UserName Case $slanguage = "eng" $mensaje12 = "Press alt to open the menu." $mensaje13 = "E&xit" $menu1 = "Schedule ..." $menu1a = "Mini Calendar Settings..." $menu2 = "Exit" $menu3 = "Help" $menu4 = "&User manual" $menu4a = "Changes" $menu5 = "About Mini Calendar" $menu6 = "Bug reporter..." $menu7 = "Options" $menu8 = "Visit website" Global $recordar1 = "Scheduled schedule" Global $recordar2 = "We remind you what you have to do " Global $recordar3 = "Remember that you have an schedule programmed right now. " Global $recordar4 = "Get ready to start your daily routines on the right foot." Global $recordar5 = "It's time to do this activity" Global $recordar6 = "Good cheer, good luck and good vibes for everything you propose to do" Global $recordar7 = "Let's hope that the next activity you do is a success" Global $recordar8 = "It is time to leave the break and resume your day with the following activity:" Global $recordar9 = "Good luck for this, " & @UserName EndSelect $recuerdaa = Random(2, 9, 1) Select Case $recuerdaa = 2 Global $recuerda = $recordar2 Case $recuerdaa = 3 Global $recuerda = $recordar3 Case $recuerdaa = 4 Global $recuerda = $recordar4 Case $recuerdaa = 5 Global $recuerda = $recordar5 Case $recuerdaa = 6 Global $recuerda = $recordar6 Case $recuerdaa = 7 Global $recuerda = $recordar7 Case $recuerdaa = 8 Global $recuerda = $recordar8 Case $recuerdaa = 9 Global $recuerda = $recordar9 EndSelect $okmessaje = "OK" Local $idmc = GUICtrlCreateMenu($programname) Local $idAgendaitem = GUICtrlCreateMenuItem($menu1, $idmc) GUICtrlSetOnEvent($idAgendaitem, "agendar") Local $idOptionsitem = GUICtrlCreateMenuItem($menu1a, $idmc) GUICtrlSetOnEvent($idOptionsitem, "Opciones") Local $idExititem = GUICtrlCreateMenuItem($menu2, $idmc) GUICtrlSetOnEvent($idOptionsitem, "exitpersonaliced") GUICtrlSetState(-1, $GUI_DEFBUTTON) Local $idHelpmenu = GUICtrlCreateMenu($menu3) Local $idHelpitema = GUICtrlCreateMenuItem($menu5, $idHelpmenu) GUICtrlSetOnEvent($idHelpitema, "ayuda") Local $idHelpitemb = GUICtrlCreateMenuItem($menu8, $idHelpmenu) GUICtrlSetOnEvent($idHelpitemb, "WEBSITE") Local $idHelpitemc = GUICtrlCreateMenuItem($menu4, $idHelpmenu) GUICtrlSetOnEvent($idHelpitemc, "Playhelp") Local $idChanges = GUICtrlCreateMenuItem($menu4a, $idHelpmenu) GUICtrlSetOnEvent($idChanges, "readchanges2") Local $idBGR = GUICtrlCreateMenuItem($menu6, $idHelpmenu) GUICtrlSetOnEvent($idBGR, "readchanges2") ;GUICtrlCreateMenuItem("", $idmc, 2) GUICtrlSetState(-1, $GUI_CHECKED) GUICtrlCreateLabel($mensaje12, 0, 100, 20, 20, $WS_TABSTOP) GUICtrlSetState(-1, $GUI_FOCUS) Local $idManualbutton = GUICtrlCreateButton($menu4, 65, 100, 20, 20) GUICtrlSetOnEvent($idManualbutton, "playhelp") Local $idExitbutton = GUICtrlCreateButton($mensaje13, 120, 100, 20, 20) GUICtrlSetOnEvent($idExitbutton, "exitpersonaliced") GUISetState(@SW_SHOW) While 1 WEnd EndFunc ;==>principal ;This is the part of the graphical interface of the menu of my program, now the file options.au3 goes. Func opciones() Opt("GUIOnEventMode", 1) $directorio = "c:\users\" & @UserName & "\AppData\Roaming\Microsoft\Windows\Start Menu\Programs" Local $rutadelarchivo = $directorio & "\Mini Calendar.nlk" Select Case $slanguage = "es" $mensaje0 = "Menú de opciones" $mensaje1 = "Iniciar Mini Calendario y agenda Con Windows (beta)" $mensaje2 = "Guardar opciones (recomendado)" $mensaje2a = "Buscar actualizaciones (recomendado)" $mensaje2b = "Mover el mini calendario a la bandeja del sistema" $mensaje3 = "Selecciona la salida de voz:" $mensaje4 = "&Aplicar" $mensaje5 = "&Cerrar" $mensaje6 = "No se ha podido crear el acceso directo... Puedes intentar lo siguiente: " & @CRLF & "Método 1: Ejecuta el programa como administrador, abre el menú, vé a opciones y marca la casilla que acavas de marcar." & @CRLF & "Método 2: Puede que hayan otras acciones en curso que hacen necesario reiniciar el pc. Deberías reiniciarlo, abrir este programa y volver a marcar esta casilla." $mensaje7 = "Selecciona la salida de texto a voz" $mensaje8 = "Esta es una prueba de síntesis de voz" $mensaje9 = "Inicio creado" $mensaje9a = "Por favor, reinicia tu pc para que estos cambios surtan efecto. Cierra todas las ventanas de esta aplicación que estés usando y procede con el reinicio." Case $slanguage = "eng" $mensaje0 = "Options menu" $mensaje1 = "Start Mini Calendar and scheduler With Windows (beta)" $mensaje2 = "Save options (recommended)" $mensaje2a = "Check for updates (recommended)" $mensaje2b = "Move the mini calendar to the system tray" $mensaje3 = "Select the voice output:" $mensaje4 = "&Aply" $mensaje5 = "&Close" $mensaje6 = "The shortcut could not be created... You can try the following: " & @CRLF & "Method 1: Run the program as administrator, open the menu, go to options and check the box you just checked . " & @CRLF & "Method 2: There may be other actions in progress that make it necessary to restart the pc. You should restart it, open this program and check this box again." $mensaje7 = "Select text-to-speech output" $mensaje8 = "This is a speech synthesis test" $mensaje9 = "Start created" $mensaje9a = "Please restart your pc for the changes to take effect. Close the windows of this application that you are using and then proceed to restart." EndSelect $guioptions2 = GUICreate($mensaje0) $idStartWindows = GUICtrlCreateCheckbox($mensaje1, 50, 100, 20, 25) GUICtrlSetOnEvent($idStartWindows, "iniciarconwindows") $idSabesettings = GUICtrlCreateCheckbox($mensaje2, 85, 100, 20, 25) GUICtrlSetOnEvent($idSabesettings, "guardaropciones") $idCheckUpds = GUICtrlCreateCheckbox($mensaje2a, 120, 100, 20, 25) GUICtrlSetOnEvent($idCheckUpds, "buscaractualizaciones") $idMinimize = GUICtrlCreateCheckbox($mensaje2b, 145, 100, 20, 25) GUICtrlSetOnEvent($idMinimize, "minimizar") $voice_Label = GUICtrlCreateLabel($mensaje7, 130, 100, 20, 25) $idChangevoice1 = GUICtrlCreateCombo("Sapi", 130, 120, 20, 30, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL)) GUICtrlSetData($idChangevoice1, "NVDA|JAWS") ;GUICtrlSetOnEvent($idChangevoice1, "Cambiarvoz") $idBTN_Close = GUICtrlCreateButton($mensaje5, 150, 100, 50, 25) GUICtrlSetOnEvent($idBTN_Close, "eliminar") GUISetState(@SW_SHOW) Local $sComboRead = "" ;while 1 ;Wend EndFunc ;==>opciones Func iniciarconwindows() If _IsChecked_audio($idStartWindows) Then FileCreateShortcut(@ScriptFullPath, $rutadelarchivo, "", "", "", "", "") If Not @error Then MsgBox(48, $mensaje9, $mensaje9a) Else MsgBox(0, "Error", $mensaje6) EndIf Else SoundPlay(@TempDir & "\sounds\soundsdata.dat\CHECKBOX_unchecked.MP3", 0) FileDelete($rutadelarchivo) EndIf EndFunc ;==>iniciarconwindows Func guardaropciones() If _IsChecked_audio($idSabesettings) Then IniWrite("config\config.st", "General settings", "Sabe settings", "Yes") Else SoundPlay(@TempDir & "\sounds\soundsdata.dat\CHECKBOX_unchecked.MP3", 0) IniWrite("config\config.st", "General settings", "Sabe settings", "No") EndIf EndFunc ;==>guardaropciones Func buscaractualizaciones() If _IsChecked_audio($idCheckUpds) Then IniWrite("config\config.st", "General settings", "Check updates", "Yes") Else SoundPlay(@TempDir & "\sounds\soundsdata.dat\CHECKBOX_unchecked.MP3", 0) IniWrite("config\config.st", "General settings", "Check updates", "No") EndIf EndFunc ;==>buscaractualizaciones Func minimizaralabandeja() If _IsChecked_audio($idCheckMinimize) Then IniWrite("config\config.st", "General settings", "Minimize", "Yes") Else SoundPlay(@TempDir & "\sounds\soundsdata.dat\CHECKBOX_unchecked.MP3", 0) IniWrite("config\config.st", "General settings", "Minimize", "No") EndIf EndFunc ;==>minimizaralabandeja Func cambiarvoz() ;NO DISPONIBLE. $sComboRead = GUICtrlRead($idChangevoice1) IniWrite("Config\config.st", "Accessibility", "Speak Whit", $sComboRead) SoundPlay(@TempDir & "\sounds\soundsdata.dat\scroll.mp3", 0) speaking($mensaje8) EndFunc ;==>cambiarvoz Func eliminar() GUIDelete($guioptions2) EndFunc ;==>eliminar Func _IsChecked_audio($idControlID) SoundPlay(@TempDir & "\sounds\soundsdata.dat\CHECKBOX.MP3", 0) Return BitAND(GUICtrlRead($idControlID), $GUI_CHECKED) = $GUI_CHECKED EndFunc ;==>_IsChecked_audio options.au3 Edited June 1, 2021 by Melba23 Code formatted and put in code tags
Moderators Melba23 Posted June 1, 2021 Moderators Posted June 1, 2021 Mateocedillo, When you post code in future please use Code tags - see here how to do it. Then you get a scrolling box and syntax colouring as you can see above now I have added the tags. Thanks in advance for your cooperation. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
Mateocedillo Posted June 1, 2021 Posted June 1, 2021 2 hours ago, Melba23 said: Mateocedillo, When you post code in future please use Code tags - see here how to do it. Then you get a scrolling box and syntax colouring as you can see above now I have added the tags. Thanks in advance for your cooperation. M23 Hello, Apologies for the incumbents. I am really new to this forum and I am exploring little by little. I think I was able to fix the problem, but I really don't quite get used to using the EventMode. It is a good solution to increase the speed of the gui with screen readers, but previously I was used to GuiGetMSG, which by itself does this slow; I hope that in the future there will be some solution.
Developers Jos Posted June 1, 2021 Developers Posted June 1, 2021 That examples contains way too much lines and is way too complex to demo an issue. Try to simplify it to a bare minimum still showing the issue you have and I will have a look. SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past.
Mateocedillo Posted June 27, 2022 Posted June 27, 2022 On 6/1/2021 at 3:21 PM, Jos said: That examples contains way too much lines and is way too complex to demo an issue. Try to simplify it to a bare minimum still showing the issue you have and I will have a look. How had it not occurred to me before! Here is an example of GuiCtrlSetOnEvent, but commenting out the sleep in the loop. And this makes for a negligible increase in GUI navigation performance with screen readers such as NVDA. Navigation is very fluid as in many applications: expandcollapse popup#include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> Example() Func Example() Opt("GUICoordMode", 2) Opt("GUIResizeMode", 1) Opt("GUIOnEventMode", 1) GUICreate("Parent1") GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents") GUISetOnEvent($GUI_EVENT_MINIMIZE, "SpecialEvents") GUISetOnEvent($GUI_EVENT_RESTORE, "SpecialEvents") GUICtrlCreateButton("OK", 10, 30, 50) GUICtrlSetOnEvent(-1, "OKPressed") GUICtrlCreateButton("Cancel", 0, -1) GUICtrlSetOnEvent(-1, "CancelPressed") GUISetState(@SW_SHOW) ; Just idle around While 1 ;Sleep(10) WEnd EndFunc ;==>Example Func OKPressed() MsgBox($MB_SYSTEMMODAL, "OK Pressed", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle & " CtrlHandle=" & @GUI_CtrlHandle) EndFunc ;==>OKPressed Func CancelPressed() MsgBox($MB_SYSTEMMODAL, "Cancel Pressed", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle & " CtrlHandle=" & @GUI_CtrlHandle) EndFunc ;==>CancelPressed Func SpecialEvents() Select Case @GUI_CtrlId = $GUI_EVENT_CLOSE MsgBox($MB_SYSTEMMODAL, "Close Pressed", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle) Exit Case @GUI_CtrlId = $GUI_EVENT_MINIMIZE MsgBox($MB_SYSTEMMODAL, "Window Minimized", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle) Case @GUI_CtrlId = $GUI_EVENT_RESTORE MsgBox($MB_SYSTEMMODAL, "Window Restored", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle) EndSelect EndFunc ;==>SpecialEvents And now, what happens if we un-comment the sleep? Simply, the behavior is the same. There is a small delay in navigation. You could download NVDA from nvaccess.com and have a try.
Mateocedillo Posted June 27, 2022 Posted June 27, 2022 And I clarify: With GuiGetMsg() there is no way to solve this, since this has a sleep to avoid CPU consumption. But isn't there some way that even though we have a sleep it doesn't affect the performance of navigation with a graphical interface in screen readers? And the truth is, I tried with AutoHotKey and this does not happen, this is because it is a different language, while is not used to keep the script running and such.
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