In my Application on load form I execute the cursorfill and in the init I execute the cursorrefresh. In LAN mode this works and runs correctly. However, in web mode 2 times cursorfill is triggered, I believe this is one of the reasons that is affecting the performance of my application. Because several queries are executed unnecessarily on all adapters cursors. Below is a video that shows how I debugged the problem.
Hello Arcadio,
Thank you very much for this comprehensive debug report.
When a FoxInCloud server receives a request for a form of which it does not yet has a reference to, it instantiates it, form.de.openTables()
executes, and thus .cursorFill()
.
When the server executes the .wFormStandardPage()
request, if always restores the form to the initial state, without considering whether it has just instantiated the form, thus another .cursorFill()
(could be optimised however this occurs only once per form after the server has started, not worth it).
Then, form.Init()
executes with whatever parameters you pass, thus .cursorRefresh()
.
I suggest we check this sequence of actions in your test case; you can just:
- Add the end of your at your debug string, just before
+Chr(13)+Chr(10)
:+ cCallingModules()
- Execute the same test case as you previously did, plus a couple of additional user actions on the form that trigger a server response
- Please pause between actions and group debug lines by event: desktop user event, initial instantiation, restore initial state,
form.init()
, first.userEvent()
, second.userEvent()
, etc.) - Post the contents of your
dataMora.txt
file here so that we can discuss
Maybe we'll find some unexpected behaviour requiring a fix…
Thanks in advance.
I realized that every time I call a modal form, a "requery(cursorfill)" for all cursors is executed.
10/05/20 01:33:57 PM FILL
01 easytest > 02 awserverstart > 03 awstart > 04 tmrfiletimer.timer > 05 easytestserver.processhit > 06 easytestserver.process > 07 easytestserver.routerequest > 08 easyprocess.process > 09 wwprocess.process > 10 easyprocess.wformstandardpage > 11 easyprocess.wform > 12 awajax.forminitsave > 13 awapphost.oform > 14 awapphost.formlaunch > 15 awapphost.formlaunch_ > 16 cad_atend1.load
10/05/2020 01:33:58 PM REFRESH
01 easytest > 02 awserverstart > 03 awstart > 04 tmrfiletimer.timer > 05 easytestserver.processhit > 06 easytestserver.process > 07 easytestserver.routerequest > 08 easyprocess.process > 09 wwprocess.process > 10 easyprocess.wformstandardpage > 11 easyprocess.wform > 12 awajax.forminitsave > 13 awapphost.oform > 14 awapphost.oform_init > 15 cad_atend1_scx.init
10/05/2020 01:34:00 PM FILL
01 easytest > 02 awserverstart > 03 awstart > 04 tmrfiletimer.timer > 05 easytestserver.processhit > 06 easytestserver.process > 07 easytestserver.routerequest > 08 easyprocess.process > 09 wwprocess.process > 10 easyprocess.methexec > 11 easyprocess.ajaxformrequest > 12 awajax.formrequest > 13 awajax.propsrestore > 14 awajax.propsrestore_ds_views > 15 wcolview.wrequeryall > 16 wcolview.wrequery
10/05/2020 01:34:00 PM FILL
01 easytest > 02 awserverstart > 03 awstart > 04 tmrfiletimer.timer > 05 easytestserver.processhit > 06 easytestserver.process > 07 easytestserver.routerequest > 08 easyprocess.process > 09 wwprocess.process > 10 easyprocess.methexec > 11 easyprocess.ajaxformrequest > 12 awajax.formrequest > 13 awajax.formrestoreuser > 14 awajax.propsrestore > 15 awajax.propsrestore_ds_views > 16 wcolview.wrequeryall > 17 wcolview.wrequery
10/05/2020 01:35:36 PM FILL
01 easytest > 02 awserverstart > 03 awstart > 04 tmrfiletimer.timer > 05 easytestserver.processhit > 06 easytestserver.process > 07 easytestserver.routerequest > 08 easyprocess.process > 09 wwprocess.process > 10 easyprocess.methexec > 11 easyprocess.ajaxformrequest > 12 awajax.formrequest > 13 awajax.propsrestore > 14 awajax.propsrestore_ds_views > 15 wcolview.wrequeryall > 16 wcolview.wrequery
10/05/2020 01:36:24 PM FILL
01 easytest > 02 awserverstart > 03 awstart > 04 tmrfiletimer.timer > 05 easytestserver.processhit > 06 easytestserver.process > 07 easytestserver.routerequest > 08 easyprocess.process > 09 wwprocess.process > 10 easyprocess.methexec > 11 easyprocess.ajaxformrequest > 12 awajax.formrequest > 13 awajax.propsrestore > 14 awajax.propsrestore_ds_views > 15 wcolview.wrequeryall > 16 wcolview.wrequery
10/05/2020 01:36:46 PM FILL
01 easytest > 02 awserverstart > 03 awstart > 04 tmrfiletimer.timer > 05 easytestserver.processhit > 06 easytestserver.process > 07 easytestserver.routerequest > 08 easyprocess.process > 09 wwprocess.process > 10 easyprocess.methexec > 11 easyprocess.ajaxformrequest > 12 awajax.formrequest > 13 awajax.propsrestore > 14 awajax.propsrestore_ds_views > 15 wcolview.wrequeryall > 16 wcolview.wrequery
10/05/2020 01:38:56 PM FILL
01 easytest > 02 awserverstart > 03 awstart > 04 tmrfiletimer.timer > 05 easytestserver.processhit > 06 easytestserver.process > 07 easytestserver.routerequest > 08 easyprocess.process > 09 wwprocess.process > 10 easyprocess.methexec > 11 easyprocess.ajaxformrequest > 12 awajax.formrequest > 13 awajax.propsrestore > 14 awajax.propsrestore_ds_views > 15 wcolview.wrequeryall > 16 wcolview.wrequery
10/05/2020 01:40:38 PM FILL
01 easytest > 02 awserverstart > 03 awstart > 04 tmrfiletimer.timer > 05 easytestserver.processhit > 06 easytestserver.process > 07 easytestserver.routerequest > 08 easyprocess.process > 09 wwprocess.process > 10 easyprocess.methexec > 11 easyprocess.ajaxformrequest > 12 awajax.formrequest > 13 awajax.propsrestore > 14 awajax.propsrestore_ds_views > 15 wcolview.wrequeryall > 16 wcolview.wrequery
10/05/2020 01:42:21 PM FILL
01 easytest > 02 awserverstart > 03 awstart > 04 tmrfiletimer.timer > 05 easytestserver.processhit > 06 easytestserver.process > 07 easytestserver.routerequest > 08 easyprocess.process > 09 wwprocess.process > 10 easyprocess.methexec > 11 easyprocess.ajaxformrequest > 12 awajax.formrequest > 13 awajax.propsrestore > 14 awajax.propsrestore_ds_views > 15 wcolview.wrequeryall > 16 wcolview.wrequery
Yes, each time you call a form, whether a master form or a child form, FoxInCloud requeries the 'views' (CAD.cursorFill()
in your case) to restore the data to the 'initial' state (like after initial instantiation, method .awajax.formRestoreUser()
), then executes form.Init()
with whatever parameters you've passed, which may cause some other CAD.cursorFill()
.
Does this form call through "wFormmaster" need multiple "cursorfill"?
OK, let's make it extra clear… when calling .wForm*()
:
- if current server has not yet instantiated that form, instantiation executes
DE.openTables()
,form.Load()
,form.Init(.wlInitFirst)
, which executerequery()
and/or.cursorFill()
. THIS HAPPENS ONLY ONCE PER SERVER AND FORM; of course in the IDE it happens each time you start a new test. - to make sure the form is in the exact same state as when the HTML was generated, regardless when the form was instantiated, FoxInCloud restores the initial state, thus executing
requery()
and/or.cursorFill()
- FoxInCloud executes the same methods as in desktop mode:
form.Init()
,form.refresh()
,form.show()
,form.activate()
, etc., which execute the samerequery()
and/or.cursorFill()
than in desktop mode.
Compared to desktop:
- (1) executes once per server and form, and is almost negligible in production
- (2) executes one time more compared to desktop mode
All are necessary in FoxInCloud.
I understand your explanation better now. Shouldn't the "uFormsLaunchAt Startup" method leave the form instantiated and, in development mode, should it already appear on the screen during execution? This is not happening here. What could I have done wrong?
uFormsLaunchAtStartup = 'cad_atend.scx, cad_atend1.scx, index.scx, index1.scx'
Forms are visible in the IDE in development mode only (do atPJcompileDebugmode
).
Indeed, FoxInCloud server instantiates all forms mentioned in .uFormsLaunchAtStartup
at startup. You can see this happen in the server interface (little greyish form below)
If you want to see which forms are instantiated in the server at a given moment, go to debugger > locals, expand goWCserver.oAppHost.aForms[]