Q197510: FIX: Poor Performance with Forms Containing Many Objects
Article: Q197510
Product(s): Microsoft FoxPro
Version(s): WINDOWS:6.0
Operating System(s):
Keyword(s): kbOOP kbPerfMon kbvfp600 kbvfp600bug kbVS600sp3fix kbvfp600QFE
Last Modified: 05-OCT-1999
-------------------------------------------------------------------------------
The information in this article applies to:
- Microsoft Visual FoxPro for Windows, version 6.0
-------------------------------------------------------------------------------
SYMPTOMS
========
Instantiating a form or container that contains many objects, may be much slower
in Visual FoxPro version 6.0 than in Visual FoxPro version 5.0.
If the form contains a pageframe with multiple pages, page activation may be much
slower in Visual FoxPro 6.0 than in Visual FoxPro 5.0.
Normally, this behavior does not manifest itself unless the form or container
instantiated contains at least several hundred objects.
STATUS
======
Microsoft has confirmed this to be a bug in the Microsoft products listed at the
beginning of this article.This bug was corrected in Visual Studio 6.0 Service
Pack 3..
MORE INFORMATION
================
Steps to Reproduce Behavior
---------------------------
1. Run the following code from a program (.prg) file:
* This program creates a number of forms that each
* add a pageframe at run-time. Each page activates
* after the pageframe is instantiated. The number of forms,
* pages in the pageframe, and text boxes on each page
* are set from the #DEFINE statements. The times in seconds for
* each form to add its objects, and activate each page
* are echoed to the Debug Output window. The total time in
* seconds for all forms is echoed last.
#DEFINE NO_OF_FORMS 10
#DEFINE NO_OF_PAGES 20
#DEFINE NO_OF_TEXTBOXES 10
DEBUG
DEBUGOUT ''
PUBLIC gnStart
gnStart = SECONDS()
FOR lni = 1 TO NO_OF_FORMS
lcfrmName = 'oform'+ALLTR(STR(lni))
&lcfrmName = CREATEOBJECT('perfform')
&lcfrmName..CAPTION = SUBSTR(lcfrmName,2)
&lcfrmName..SHOW()
ENDFOR
FOR lnj = 1 TO _SCREEN.FORMCOUNT
lcfrmName = 'oform'+ALLTR(STR(lnj))
&lcfrmName..SHOW()
lnstart = SECONDS()
FOR lnk = 1 TO &lcfrmName..pf1.PAGECOUNT
&lcfrmName..pf1.ACTIVEPAGE = lnk
ENDFOR
DEBUGOUT 'Form '+ ALLTR(STR(lnj)) + ;
': '+alltr(str(SECONDS() - lnstart,5,2))
ENDFOR
DEBUGOUT 'All forms: '+alltr(str(SECONDS() - gnStart,5,2))
READ EVENTS
DEFINE CLASS perfform AS FORM
HEIGHT = 350
ADD OBJECT pf1 AS PAGEFRAME WITH ;
PAGECOUNT = 0
PROC pf1.INIT()
THIS.HEIGHT = THIS.PARENT.HEIGHT - 5
FOR lnj = 1 TO NO_OF_PAGES
THIS.ADDOBJECT('pg'+ALLTR(STR(lnj)), 'pg')
ENDFOR
ENDPROC
ENDDEFINE
DEFINE CLASS pg AS PAGE
PROC ACTIVATE()
IF TYPE('this.cntPage') # 'O'
THIS.ADDOBJECT("cntPage", "cnPageContainer")
ENDIF
ENDPROC
ENDDEFINE
DEFINE CLASS cnpagecontainer AS CONTAINER
NAME = "cnpagecontainer"
VISIBLE = .T.
Top = 5
ADD OBJECT cmd1 AS COMMANDBUTTON WITH ;
LEFT = 180, ;
TOP = 20, ;
CAPTION = 'Quit', ;
VISIBLE = .T.
PROC INIT()
THIS.HEIGHT = THIS.PARENT.PARENT.HEIGHT - 20
THIS.WIDTH = THIS.PARENT.PARENT.WIDTH - 5
FOR lnp = 1 TO NO_OF_TEXTBOXES
THIS.ADDOBJECT('lbl'+ALLTR(STR(lnp)), 'label')
WITH THIS.CONTROLS(lnp+1)
.LEFT = 10
.TOP = 25*(lnp-1)+ 2
.WIDTH = 80
.NAME = 'lbl'+ALLTR(STR(lnp))
.VISIBLE = .T.
ENDWITH
ENDFOR
FOR lnq = lnp TO (2 * lnp) - 2
THIS.ADDOBJECT('txt'+ALLTR(STR(lnq)), 'textbox')
WITH THIS.CONTROLS(lnq+1)
.HEIGHT = 23
.LEFT = 90
.TOP = 25*(lnq-lnp)+ 2
.WIDTH = 80
.NAME = 'txt'+ALLTR(STR(lnq))
.VISIBLE = .T.
ENDWITH
ENDFOR
ENDPROC
PROC cmd1.CLICK
gnStart = SECONDS()
CLEAR EVENTS
ENDPROC
ENDDEFINE
2. Note the "All forms:" time in the Debug Output window. This will be around
five times higher in Visual FoxPro 6.0 than in Visual FoxPro 5.0.
This example is specifically designed to exhibit the behavior. As written, it
instantiates over 2000 objects and activates 200 pages. The impact of this issue
on your application is likely to be much less, since most applications do not
simultaneously instantiate 200 pages with 10 objects each.
Steps to Reproduce Behavior
---------------------------
REFERENCES
==========
Additional query words: kbVFP6QFE
======================================================================
Keywords : kbOOP kbPerfMon kbvfp600 kbvfp600bug kbVS600sp3fix kbvfp600QFE
Technology : kbVFPsearch kbAudDeveloper kbVFP600
Version : WINDOWS:6.0
Issue type : kbbug
Solution Type : kbfix
=============================================================================
THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.
Copyright Microsoft Corporation 1986-2002.