I'll try to summerize the problem I encounter
I use PowerBuilder 2017R3
I have a window
That window has 3 arrays of userobjects in the instance variables
u_datawindow idw_reports (the report datawindow)
u_sort_options iuo_sort_options (contains two datawindow)
u_report_criterias iuo_report_criterias (can contain anything from checkboxes radio buttons datawindows etc.)
the window has a menu that contains a list of reports.
The same window is used for several lists of reports (menu is loaded dynamicaly)
When I click on the menu I call a function open_report that acts like that.
if a_report_is_opened then
this.idw_reports[displayed_report_index].visible = false
this.iuo_sort_options[displayed_report_index].visible = false
this.iuo_report_criterias[displayed_report_index].visible = false
if report_has_already_been_openened_once then
this.idw_reports[report_index].visible = true
this.iuo_sort_options[report_index].visible = true
this.iuo_report_criterias[report_index].visible = true
The openuserobject on iuo_report_criterias may trigger some post_construtor events.
Works great but I have performance issues
Each time I open a new report it takes exponentialy longer to open. if you open a report in first it will take a second, if you open the same report in 5th it will 10 seconds. It does seem it's not the actual open process but the application hangs.
During my tests:
I did not retrieve the report datawindow to avoid any unecessary overlay.
I activated the Trace with a trace all activities.
The open_report function always performs the same (modulo a few milliseconds) wether you open the same report in first or 5th or 10th)
I tried to time the open_report function and the result is consistent with the trace.
The application will hang the same wether I openuserObject or visible = true
The post_construtor events always performs the same as well.
You can see on the screen that objects are correctly displayed before the application hangs.
I checked the performance of the calls in the trace file, and this is where I'm at a loss, there is nothing there consumming the CPU appart from the opens and post_constructor, and they perform consistently across the board.
That means there os something that freezes my application for a few seconds (more and more with each call) and that is not traced by the PB Trace.
In my open_report function if I replace the visible = false with closeUserObject() the hang is less visible but it still happens.
if I drop my arrays for a non array instance variable of each type there is no problem.
That lead me to think that the problem comes from the object arrays getting bigger (even if the object in it are being destroyed).
The non array approach is not an option because I do not want my users to have to re-retrieve the reports they already have retrieved. I do not want them to lose the report criterias they filled each time they want to open a news report in the same window.
I need help to be able to pinpoint where the performance issue is coming from.
If you have any advice on how I could to the same thing without the object arrays I'd be gratefull.