[Ungelöst aufgegeben] Ajax / Win CE / Speicherproblem

matiro65

New member
Hallo Leute.

In meinem aktuellen Projekt besteht die Anforderung, Inhalte auf einer Web-Seite alle n (im folgenden Beispiel 2) Sekunden ohne reload zu aktualisieren.

Ich habe das mit Ajax umgesetzt, prinzipiell wie folgt:
Code:
function repeat(){
  var xmlo = new ActiveXObject(...);
  xmlo.onreadystatechange=function(){  //aktualisiere Inhalt }
  var f1="file.php?t="+ new Date().getTime(); // Parameter zur Vermeidung von caching Problemen
  xmlo.open("get", f1, true);
  xmlo.send();
  setTimeout(repeat, 2000);
  }

repeat();


Das funktioniert eigentlich ganz gut, bis mir nach einer gewissen Zeit der anzeigende Computer abstürzt, mit Hinweis auf "Speicherprobleme". Der Anzeigende Computer ist ein Panel-PC mit Windows CE 6.x.

Fällt jemandem dazu etwas ein?

Danke und Gruß - Matthias
 
Zuletzt bearbeitet von einem Moderator:
AW: Ajax / Win CE / Speicherproblem

All modern browsers support the XMLHttpRequest object (IE5 and IE6 use an ActiveXObject).
Du möchtest ernsthaft noch den IE≤6 unterstützen?


Wieso verwendest du ein ActiveX-Object (nicht als Fallback, sondern einzig)?? Ich denke kaum, dass du nur den IE unterstützen willst...
In allen anderen Browsern funktioniert Ajax nämlich über XMLHttpRequest.
 
AW: Ajax / Win CE / Speicherproblem

im tatsächlichen Code verwende ich eine "Browserweiche", die Seite funktioniert auch mit den aktuellsten Versionen von Firefox, IE, Chrome - das brauche ich allerdings nur zum testen.
In der Produktivumgebung ist es alternativ- und ausnahmslos der Panel PC mit Windows CE, da ist ein IE6 drauf, der braucht das ActiveX Objekt - deshalb habe ich das auch so im Beispiel verwendet.

- - - Aktualisiert - - -

in inhalt" werden zirkelschlüsse enthalten sein, die der browser nicht sauber auflösen kann.
fang mal an, an allen elementen, die du in "aktualisiere Inhalt" entfernst die eventhandler vorher zu entfernen.

In "inhalt aktualisieren" wird der ajax responsetext ausgewertet und 5 x div.innerHTML=neuerwert zugewiesen. Keines der divs hat einen Eventhandler registriert.


Sorry, ich hab' die editier/antwort-funktionen hier wohl noch nicht im Griff
 
Zuletzt bearbeitet:
AW: Ajax / Win CE / Speicherproblem

War da nicht etwas, dass bei dem IE ein null bei send reingehört um den memory leak zu umgehen?
Auch sollte der Wiederholungsaufruf setTimeout() in die Funktion, wo der Inhalt aktualisiert wird onreadystatechange, da es sonst passieren kann das die Funktion erneut nach 2000 ms aufgerufen wird, obwohl der Request noch nicht abgeschlossen ist:
Code:
function repeat(){
	var xmlo = new ActiveXObject(...);

	xmlo.onreadystatechange = function () {
		//aktualisiere Inhalt
		setTimeout(repeat, 2000);
	}
	var f1 = "file.php?t="+ new Date().getTime(); // Parameter zur Vermeidung von caching Problemen
	xmlo.open("get", f1, true);
	xmlo.send(null);
}

repeat();
 
AW: Ajax / Win CE / Speicherproblem

Zeige doch mal deinen kompletten Code.

Nach welcher Zeit tritt denn das Speicherproblem ca. auf? Kannst du auf dem Rechner den Speicherbedarf beobachten? Wie stark steigt da der Speicherbedarf mit der Zeit?

PS: Auf Windows CE 6.x kann man auch alternative Browser installieren... den IE6 sollte man wirklich nicht mehr verwenden.
 
AW: Ajax / Win CE / Speicherproblem

Ich habe den code angepasst wie von miniA4Kuser beschrieben, leider ist der Panel-PC wieder stehen geblieben, nach geschätzt 1.5 Stunden.

Ich habe schon versucht OperaMini einzusetzen, das hat nicht auf Anhieb geklappt, und mir hat die Geduld gefehlt das Problem zu lösen.... vielleicht muss ich da nochmal ran. Gibt's Vorschläge für andere Browser?

Ich habe jetzt weitere Änderungen in den Code gebaut, setze die in der Funktion erstellen Objekte auf null bevor die Funktion verlassen wird. Mal schaun, ob das was bringt.

Unten der aktuelle code, leicht "verbesserlesbart".

Code:
function fnUpdateRoomInfo(){
			
	var xlmo;

	if (window.XMLHttpRequest) {
			xlmo = new XMLHttpRequest(); // Mozilla, Safari, Opera
		} 
	else if (window.ActiveXObject) {
		try {
			xlmo = new ActiveXObject('Msxml2.XMLHTTP'); // IE 5
			} 
		catch (e) {
			try {
				xlmo = new ActiveXObject('Microsoft.XMLHTTP'); // IE 6
				} 
			catch (e) {}
			}
		}
	
	xlmo.onreadystatechange=function(){
		if ((xlmo.readyState==4) && (xlmo.status==200)){
			
			if (xlmo.responseText=="") {
				document.getElementById("idTblTimeRange1").innerHTML="";
				document.getElementById("idTblTimeRange2").innerHTML="";
				document.getElementById("idTblText1").innerHTML="";
				document.getElementById("idTblText2").innerHTML="";
				document.getElementById("idNoEntriesFound2").innerHTML="<b>Herzlich Willkommen</b>"; 
				}
			else {
				var info = [];
				info=eval(xlmo.responseText);
				document.getElementById("idNoEntriesFound2").innerHTML=""; 
				document.getElementById("idTblTimeRange1").innerHTML=info[0]; 
				document.getElementById("idTblTimeRange2").innerHTML=info[0]; 
				document.getElementById("idTblText1").innerHTML=info[1]; 
				document.getElementById("idTblText2").innerHTML=info[2];
				info=null;
				}
			
			xlmo=null;		
			setTimeout(fnUpdateRoomInfo, 1000);
			}
		}
	
	var fileToLoad="dcds_display_upd_roominfo.php?"+document.URL.split("?")[1]+"&"+new Date().getTime();
	xlmo.open("get", fileToLoad, true);
	xlmo.send(null);
	}

fnUpdateRoomInfo();
 
AW: Ajax / Win CE / Speicherproblem

nach geschätzt 1.5 Stunden.
Also nach ca. 5400 Durchläufen... viel Arbeitsspeicher hat der Rechner denn?

Was ist denn eine typische Antwort der php-Datei?

Eventuell könnte ein
Code:
xlmo.responseText = "";
nach dem eval (bäh... aber im IE6 ist JSON.parse() ja noch nicht drin... aber dann solltest du einen Shim verwenden) noch helfen.

PS: als Notlösung könntest du auch die Seite jede Stunde per window.setTimeout() und location.reload() neu laden...
 
AW: Ajax / Win CE / Speicherproblem

Die PHP-Datei gibt einen String von vielleicht 80 bis 100 Zeichen zurück, den responseText auf "" zu setzen werde ich noch probieren.
In der Produktiv-Umgebung kann der Zeitwert für setTimeout übrigens deutlich höher liegen, da langen 60.000, der sitzt hier auf 1000 weil ich so zügiger testen kann, ob die Sache "dauerfest" ist. Angesichts dessen würde sogar einmal am Tag neu laden ausreichen. Ich hätt's aber schon gern ohne Workaround gelöst...
 
AW: Ajax / Win CE / Speicherproblem

Keine Ahnung ob das hier was bringt:
Code:
function fnUpdateRoomInfo() {
	var xlmo;

	function proceedResponse() {
		if ((xlmo.readyState === 4) && (xlmo.status === 200)) {
			if (xlmo.responseText === "") {
				document.getElementById("idTblTimeRange1").innerHTML = "";
				document.getElementById("idTblTimeRange2").innerHTML = "";
				document.getElementById("idTblText1").innerHTML = "";
				document.getElementById("idTblText2").innerHTML = "";
				document.getElementById("idNoEntriesFound2").innerHTML = "<b>Herzlich Willkommen</b>";
			} else {
				var info = [];
				info = eval(xlmo.responseText);
				document.getElementById("idNoEntriesFound2").innerHTML = "";
				document.getElementById("idTblTimeRange1").innerHTML = info[0];
				document.getElementById("idTblTimeRange2").innerHTML = info[0];
				document.getElementById("idTblText1").innerHTML = info[1];
				document.getElementById("idTblText2").innerHTML = info[2];
				info = null;
			}
			xlmo = null;
			setTimeout(function () {
				makeRequest("dcds_display_upd_roominfo.php?" + document.URL.split("?")[1] + "&" + new Date().getTime());
			}, 1000);
		}
	}

	function makeRequest(url) {
		if (window.XMLHttpRequest) {
			xlmo = new XMLHttpRequest(); // Mozilla, Safari, Opera
		} else if (window.ActiveXObject) {
			try {
				xlmo = new ActiveXObject('Msxml2.XMLHTTP'); // IE 5
			} catch (e) {
				try {
					xlmo = new ActiveXObject('Microsoft.XMLHTTP'); // IE 6
				} catch (e) {}
			}
		}

		xlmo.onreadystatechange = proceedResponse;
		xlmo.open("get", url, true);
		xlmo.send(null);
	}

	makeRequest("dcds_display_upd_roominfo.php?" + document.URL.split("?")[1] + "&" + new Date().getTime());
}

fnUpdateRoomInfo();
 
AW: Ajax / Win CE / Speicherproblem

Ich habe mittlerweile viel zum Thema gelesen, aber leider noch keine saubere Lösung gefunden. Grund scheint ein Bug im IE6 zu sein, der bei Anwendung von "circular references" bzw. "closures" zu einem "memory leak" führt - hesst hat das Stichwort "Zirkelschluss" bereits genannt. Hier gibt's was von MS zum Thema: A memory leak occurs in Internet Explorer 6 when you view a Web page that uses JScript scripting on a Windows XP-based computer

Der Lösungsansatz das Objekt nach vollendeter Aufgabenstellung zu "nullen" scheint mir prinzipiell richtig.

Wenn ich das allerdings in dem handler für "onreadystatechange" mache, scheint es nicht zu funktionieren - der verfügbare Speicherplatz sinkt mit jedem Aufruf um 8 bis 16 kB.

Code:
fnUpdateRoomInfo(){

    var xlmo = function(){//return functional Ajax object}

    xlmo.onreadystatechange = function(){
        if ((xlmo.readyState == 4) && (xlmo.status == 200)) {
            //do something}            
            }

        xlmo.onreadystatechange = null;
        delete xlmo.onreadystatechange;
        xlmo = null;
        setTimeout(fnUpdateRoomInfo, 1000);
        }

    var fileToLoad="dcds_display_upd_roominfo.php?"+document.URL.split("?")[1]+"&"+new Date().getTime();
    xlmo.open("get", fileToLoad, true);
    xlmo.send(null);

    }

fnUpdateRoomInfo()

Nulle ich schon bevor der handler aufgerufen wird, bleibt der verfügbare Speicher konstant, allerdings funktioniert dann der Code natürlich nicht (weil das Objekt zu früh gelöscht wird).

Code:
fnUpdateRoomInfo(){

    var xlmo = function(){//return functional Ajax object}

    xlmo.onreadystatechange = function(){
        if ((xlmo.readyState == 4) && (xlmo.status == 200)) {
            //do something}            
            }
        setTimeout(fnUpdateRoomInfo, 1000);
        }

    var fileToLoad="dcds_display_upd_roominfo.php?"+document.URL.split("?")[1]+"&"+new Date().getTime();
    xlmo.open("get", fileToLoad, true);
    xlmo.send(null);

    xlmo.onreadystatechange = null;
    delete xlmo.onreadystatechange;
    xlmo = null;
    }

fnUpdateRoomInfo()

Angeblich gibt's von MS einen Fix für das Problem, ich habe noch nicht mit ausreichend Energie probiert den zu finden und zu installieren (bin nicht sicher, ob das mit CE so einfach möglich ist). Mal schaun. Bin ziemlich im Stress derzeit, sorry für's schleifen lassen.

- - - Aktualisiert - - -

@ miniA4kuser : Deinen Code habe ich auch probiert, hat nicht auf Anhieb funktioniert, ich gehe das nochmal an
 
Zuletzt bearbeitet:
AW: Ajax / Win CE / Speicherproblem

Sorry aber was willst du ernsthaft mit dem IE6??????
Win CE

Wenn ich das allerdings in dem handler für "onreadystatechange" mache, scheint es nicht zu funktionieren - der verfügbare Speicherplatz sinkt mit jedem Aufruf um 8 bis 16 kB.
du musst alle finden, da gab es auch ein tool - iesieve, was dir die stellen im ie6 angezeigt hat, aber ob es das auch für ce gibt weiss ich nicht.
 
AW: Ajax / Win CE / Speicherproblem

Du könntest mal probieren, ob's funktioniert, wenn du auf das XHR über den Kontext und nicht über eine lokale Variable zugreifst:
Code:
function readyStateEventListener(){
	if (this.readyState === 4 && this.status === 200){
		// do something
	}
	this.responseText = null;
	this.responseXML = null;
	this.onreadystatechange = null;
	window.setTimeout(fnUpdateRoomInfo, 1000);
}
function fnUpdateRoomInfo(){

    var xlmo = function(){//return functional Ajax object}

    xlmo.onreadystatechange = readyStateEventListener;

    var fileToLoad="dcds_display_upd_roominfo.php?"+document.URL.split("?")[1]+"&"+new Date().getTime();
    xlmo.open("get", fileToLoad, true);
    xlmo.send(null);
}

fnUpdateRoomInfo()
 
Zurück
Oben