Hello,
        I have a class (DataTable) that extends Window whose only widget is a 
table. DataTable has a property called data that is bound to a JSON data store. 
I have an interval timer set up that triggers a refresh of the data store. The 
property data has an apply function which sets the table's tablemodel data, 
which causes the table to display the newly fetched data. The problem I am 
having is that with a refresh rate of every few seconds, the browser memory 
consumption continually grows. This application is intended to be left running 
on status displays indefinitely. The code for my DataTable class is below. I am 
attempting some memory clean up (as you will see) which I am assuming is 
incorrect as it is not preventing the memory growth. I am hoping someone can 
point me in the correct direction to prevent the memory consumption I am 
seeing. I suspect that some data structures are still linked to DOM nodes and 
therefore preventing garbage collection, but am not well versed enough to dig 
into that theory...

        Thanks in Advance,
        Nate

qx.Class.define("edcwebapp.DataTable", 
{
        extend: edcwebapp.BaseWindow,
        properties: {
                winTitle: {
                        init: "Table Data"
                },
                columnHeaders: {
                        init: ["A", "B" ],
                        apply: "setColHeads"
                },
                dbSessionId: {
                        nullable: true,
                        init: null
                },
                pullUrl: {
                        init: "/get_data"
                },
                refreshDelay: {
                        nullable: false,
                        init: 5
                },
                data: {
                        nullable: true,
                        init: null,
                        apply: "applyData"
                },
                tableModel: {
                        nullable: true,
                        init: null
                },
                table: {
                        nullable: true,
                        init: null
                }
        },
        construct: function()
        {
                this.base(arguments);
                this.setCaption(this.getWinTitle());
                var layout = new qx.ui.layout.Grow();
                this.setLayout(layout);
                this.addListener("close", this.onClose, this);
                
                this.setTableModel(new qx.ui.table.model.Simple());
                var tmd = [ [ "please log in" ] ];
                this.getTableModel().setColumns( this.getColumnHeaders() );
                this.getTableModel().setData(tmd);
                
                this.setTable(new qx.ui.table.Table(this.getTableModel(), 
null));

                this.add(this.getTable());
                this.timer = qx.util.TimerManager.getInstance();
                this.timerId = null;
        },
        destruct: function() 
        {
                if ( this.timerId )
                        this.timer.stop(this.timerId);
        },
        members: {
                start: function() 
                {
                        if ( !this.getDbSessionId() )
                                return;
                        var url = this.getPullUrl() + "?edc_session_uuid=" + 
this.getDbSessionId() ;
                        this.data = new qx.data.store.Json();
                        this.data.bind("model", this, "data");
                        this.data.setUrl(url);
                        if ( this.getRefreshDelay() > 0 )
                                this.timerId = this.timer.start(this.refresh, 
this.getRefreshDelay() * 1000, this, null, 100);
                },
                refresh: function()
                {
                        this.data.reload();
                },
                applyData: function(value, old)
                {
                        if ( value )
                        {
                                var arr = value.toArray();
                                var ColHead = null;
                                // check if the middleware returned a header row
                                // if so we'll just create a new table later 
on...
                                if (arr[0].toArray()[0] == '__header__')
                                {
                                        var table = this.getTable();
                                        this.remove(table);
                                        var model = this.getTableModel();
                                        this.setTableModel(new 
qx.ui.table.model.Simple());
                                        var tmp = arr[0].toArray();
                                        tmp.shift();
                                        ColHead = tmp;
                                        arr.shift();

                                        this._disposeObjects("model");
                                        this._disposeObjects("table");
                                        delete model;
                                        delete table;
                                }

                                var arr2 = [ ];
                                console.log("copying array");
                                for ( var i = 0; i < arr.length; i++ )
                                {
                                        var row = arr[i].toArray();
                                        arr2[i] = row;
                                }

                                var oldData = this.getTableModel().getData();

                                if ( ColHead )
                                {
                                        this.setColumnHeaders(tmp);
                                }
                                this.getTableModel().setData(arr2);
                                if ( ColHead )
                                {
                                        this.setTable(new 
qx.ui.table.Table(this.getTableModel(), null));
                                        this.add(this.getTable());
                                }

                                this._disposeArray("oldData");
                                delete oldData;
                                this._disposeArray("value");
                                delete value;
                                value = null;
                                this.fireDataEvent("dataRefreshed", this);
                        }
                        if ( old )
                        {
                                this._disposeArray("old");
                                delete old;
                                old = null;
                        }
                },
                onClose: function()
                {
                        console.log("DataTable window closed");
                        if ( this.timerId )
                                this.timer.stop(this.timerId);
                },
                setColHeads: function(value, old)
                {
                        if (value)
                        {
                                console.log("setColumns called");
                                var tmd = this.getTableModel();
                                if ( tmd )
                                {
                                        console.log("setColumns called with 
model");
                                        //var idx = [];
                                        //for ( var i = 0; i < value.length; 
i++ )
                                        //      idx.push(i);
                                //      tmd.setColumns(value, idx);
                                        tmd.setColumns(value);

                                        //for ( i = 0; i < value.length; i++ )
                                        //      
this.getTable().getTableColumnModel().setColumnVisible(i, true);
                                }
                        }
                }

        },
        events: {
                "dataRefreshed": "qx.event.type.Data"
        }
});
------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_mar
_______________________________________________
qooxdoo-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel

Reply via email to