Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Software>Widget-Programmierung: Wie CPU-Last im deaktivierten Zustand...

Widget-Programmierung: Wie CPU-Last im deaktivierten Zustand...

bald11.10.0512:46
OK, letzter Versuch:

Wenn ich das Widget alle x Minuten über (zum Beispiel) ein Meta-Refresh reloade funktioniert danach der "Flip"-Effekt vom Widget nicht mehr, d.h. beim Klick auf das "i" wird sofort die Rückseite eingeblendet - ohne Animation

Woran liegt das bzw. wie kann man das verhindern?

(Das passiert auch wenn man anstatt eines Meta-Refresh ein Javascript, zum Beispiel "window.location.reload()" benutzt...)
0

Kommentare

bald11.10.0513:01
Eine Idee habe ich noch: Wäre es nicht möglich der "onhide"-Funktion zuzufügen, dass das Widget per ⌘-R neugeladen wird? Kann man diese Tastenkombination per Javascript ausführen?
Oder per Applescript ausführen, das in Javascript eingebettet ist??
0
stiffler
stiffler11.10.0513:17
Wo kommen denn die Daten her?
Von einem Script? (PHP/CGI/...)
„To understand recursion you need to understand recursion“
0
bald11.10.0513:49
stiffler
Mmh. Das ginge auch recht einfach mit JS, nur musst du dann wissen, welche Bilder du auf dem Server liegen hast.

Ja, die weiß ich... ich habe auch schon ein Javascript probiert, dass in einem bestimmten Intervall die Bild herunterlädt... das Problem dabei ist, dass das Widget sich dabei immer mehr aufbläht (bzw den Speicher, den es verbraucht

Das Script wird hier besprochen:

Aber wie gesagt, am lieb sten wäre es mir, wenn das Bild nur neu geladen wird, wenn man Dashboard wieder einblendet (mit onshow)... *seufz*
0
bald11.10.0513:22
stiffler
Wo kommen denn die Daten her?
Von einem Script? (PHP/CGI/...)


Welche Daten? Nun ja, das Widget zeigt ein gif-Bild an... Und dieses soll von Zeit zu Zeit bzw. dann wenn Dashboard eingeblendet wird, neu vom Server geladen werden.

...oder was meinst Du?
0
stiffler
stiffler11.10.0513:26
Genau das meine ich.
Dann schreib doch einfach ein Script, welches dir das Bild bereitsstellt.
Im Widget gibst du dann folgendes (abstrakt) an:

<img src="www.server.de/getImage.php" />

„To understand recursion you need to understand recursion“
0
bald11.10.0513:34
stiffler
Genau das meine ich.
Dann schreib doch einfach ein Script, welches dir das Bild bereitsstellt.
Im Widget gibst du dann folgendes (abstrakt) an:

<img src="www.server.de/getImage.php" />

gg, ja, das wäre schön... nee, ich greife das gif ja nur ab! Zugriff auf den Server bzw auf das Bild habe ich nicht.
...grmpf, kann doch nicht sein, dass so etwas simples nicht über ein einfaches Javascript (oder sonst was) gelöst weden kann *mecker*

amp;
0
stiffler
stiffler11.10.0513:42
Mmh. Das ginge auch recht einfach mit JS, nur musst du dann wissen, welche Bilder du auf dem Server liegen hast.
„To understand recursion you need to understand recursion“
0
stiffler
stiffler11.10.0514:04
Versuchs mal so
„To understand recursion you need to understand recursion“
0
bald11.10.0514:33
stiffler
Versuchs mal so

Wow! Also erst mal vielen Dank für Deine Mühe! Super!

Ich vermute, wir haben uns nicht so ganz verstanden Das Script lädt jedesmal wenn man das Dashboard aufruft, ein anderes Bild, richtig? Darum geht es mir aber _so_ nicht Was ich benötige, ist ein Script, dass ein Bild (eine gif-animation) NEU vom Server lädt, und zwar (am liebsten) dann wenn man Dashboard wieder aufruft.

Wenn ich jetzt von EINEM Bild rede, ist es auch nicht ganz richtig, denn es können verschiedene sein, die neu geladen werden sollen, ja nach dem was vorher ausgewählt wurde...
Deswegen gefällt mir der Weg, das über die img-id zu lösen, d.h. das Script müsste bei jedem onShow die img-src der img-id neu laden:
<img id="bild" src="je nach dem">

Ist das möglich?

Danke nochmal für die Mühe!
0
stiffler
stiffler11.10.0515:08
Verstehe. Das Bild soll also nur neu geladen werden, damit die Animation neu anläuft, richtig?

Versuchs mal so:

function onshow() {
var img = document.getElementById('bild').src; // image-src holen
document.getElementById('bild').src =''; // src leeren, damit reload erzwingen
document.getElementById('bild').src = img; // src neu setzen
}
„To understand recursion you need to understand recursion“
0
bald11.10.0515:29
stiffler Verstehe. Das Bild soll also nur neu geladen werden, damit die Animation neu anläuft, richtig?

Ja, es soll halt neu vom Server geladen werden!

Dein Script sieht gut aus Vielen Dank erneut!! Ich teste gerade, ob neu laden so funktioniert wie es nötig ist...
Ruft man Dashboard auf, wird jetzt schon mal das Bild in dem Sinne neu geladen, dass die gif-animation von ganz vorne beginnt... jetzt muss ich noch schauen, ob denn auch das gif vom Server neu heruntergeladen wird... da muss ich etwas warten...

...gab's da nicht etwas wie " + new Date " ...oder so irgendwie??

Ich melde mich gleich noch mal
0
bald11.10.0515:39
stiffler

Hmm... also es ist jetzt so, dass die gif-animation bei "onshow" zwar von vorne anfängt, aber die gif-Datei wird nicht vom Server neu geladen...

Ich bin jetzt zwar ein ganzes Stück weiter, doch nur noch diafür fehlt mir die Lösung...
Fällt Dir dazu noch etwas ein?
0
stiffler
stiffler11.10.0515:48
So in der Art vielleicht:

if (window.widget) {
widget.onhide = onhide;
widget.onshow = onshow;
var img = document.getElementById('bild').src; //src bei WidgetStart merken, da später sonst immer wieder ein String angehängt wird.
}

function onshow() {
var now = new Date();
document.getElementById('bild').src = img + '?' + now.getTime();
}
„To understand recursion you need to understand recursion“
0
bald11.10.0516:04
stiffler
[quote]So in der Art vielleicht:

*aufdieKniegeh" Jaaa, also jedesmal, wenn ich jetzt das dashboard aufrufe, habe ich (den gewünschten) Download (laut MenuMeters), was vorher nicht war. das lässt mich schon mal hoffen... jetzt muss ich mich wieder etwas gedulden...
Der Code sieht jetzt so aus:

if (window.widget) {
widget.onhide = Hide;
widget.onshow = Show;
var img = document.getElementById("picture").src; //src bei WidgetStart merken, da spaeter sonst immer wieder ein String angehaengt wird.
}

function Show()
{
...
var img = document.getElementById("picture").src; // image-src holen
document.getElementById("picture").src =""; // src leeren, damit reload erzwingen
document.getElementById("picture").src = img; // src neu setzen

var now = new Date();
document.getElementById("picture").src = img + '?' + now.getTime();
}

...ist das OK so oder muss die Zeile
document.getElementById("picture").src = img; // src neu setzen
weg??
0
bald11.10.0516:44
stiffler

Also, es scheint jetzt alles so zu funktionieren, wie ich es mir gewünscht habe!
Danke stiffler für die Mühe und Zeit, die Du investiert hast!
Kann ich Dir das Widget mal per Mail schicken (bzw. den Link wo man es herunterladen kann)?

Das einzige, was jetzt noch nicht optimal ist, ist, dass das Widget dadurch, dass es bei jedem Dashboard-Aufruf das Bild neu lädt, immer mehr Speicher und virt. Speicher verbraucht... das wächst mit der Zeit ganz schön an...

Von daher wäre es wohl am besten, wenn das Bild zwar bei onShow vom Server neugeladen wird, aber nur wenn ein bestimmter Zeitintervall (zum Beispiel 20min) vorbei ist... So würde das Bild nur neu geladen werden, wenn es auch wirklich nötig wäre...


Aber das wäre dann die Krönung... ich bin froh, dass es überhaupt jetzt schon mal ziemlich gut funktioniert!
Danke stiffler!!
0
stiffler
stiffler11.10.0516:47
Die drei Zeilen müssten (sollten) weg:

var img = document.getElementById("picture").src; // image-src holen
document.getElementById("picture").src =""; // src leeren, damit reload erzwingen
document.getElementById("picture").src = img; // src neu setzen

Warum:
beim ersten Aufruf sieht die src so aus: "bild.gif"
beim nächsten in etwa so: "bild.gif?0102145"
dann so: bild.gif?0102145?012454"
... bild.gif?0102145?012454?045454"

und wird immer länger. Also weg damit.

es sollte also so aussehen:

function Show()
{
...

var now = new Date();
document.getElementById("picture").src = img + '?' + now.getTime();
}

warum nutzt du nicht direkt die onShow() Methode?
„To understand recursion you need to understand recursion“
0
stiffler
stiffler11.10.0516:49
Klar, schick mir den Link, ich sehe es mir mal an.
„To understand recursion you need to understand recursion“
0
bald11.10.0517:00
stiffler
Die drei Zeilen müssten (sollten) weg:

var img = document.getElementById("picture").src; // image-src holen
document.getElementById("picture").src =""; // src leeren, damit reload erzwingen
document.getElementById("picture").src = img; // src neu setzen

Hmm, OK, ich habe das probiert, bloß dann verschwindet das Bild gleich wieder nachdem es geladen wurde und es erscheint nur ein ?-Kästchen (das Bild wird wohl nicht gefunden... obwohl kurz angezeigt wird)...

Ich mail Dir gleich mal einen Link, wo Du das Widget herunterladen kannst...
0
bald08.10.0519:41
...verhindern?
Wie erreicht man, dass ein Widget keine Prozessorlast frisst, wenn das Dashboard gar nicht aktiviert ist und man zum Beispiel wieder im Finder arbeitet?

Bei Apple bzw. hier @@
lese ich dazu folgendes:

"Der Dashboard Aktivierungsvorgang ist wichtig, so dass das Widget nur dann CPU-Leistung und Netzwerk-Ressourcen fordert, wenn es sichtbar ist. Der Beispielcode zeigt, wie man das macht:

if (window.widget) {
widget.onhide = onhide;
widget.onshow = onshow;
}

function onshow() {
if (timerInterval == null) {
timerInterval = setInterval("updateTime(true);", 1000);
}
}

function onhide() {
if (timerInterval != null) {
clearInterval(timerInterval);
timerInterval = null;
}
}
"

Ja, gut ...aber wo gehört das wie hin? Wenn ich es einfach so in die Javascript-Datei übernehme, wird das "i" nicht mehr angezeigt (vermutlich ist sich da irgendwas im Wege..)
Ich kenne mich mit Javascript leider nicht sehr gut... hat da jemand vielleicht einen Tip??
0
bald10.10.0512:29
Das oben erwähnte Problem habe ich nun gelöst...
Jetzt habe ich aber eine andere Javascript-Frage:

Und zwar möchte ich, dass ein Bild bzw dessen id(!) neu geladen wird, wenn das Dashboard (wieder) aktiviert wird...
etwa nach dieser Methode:

_________
if (window.widget) {
widget.onhide = onhide;
widget.onshow = onshow;
}

function onshow()
{
document.getElementById("meinBild").image.reload...;
}

function onhide()
{
...
}
_________

Kann man das realisieren?
Ich habe nichts passendes ergoogeln können und kenne mich mit Javascript nicht sonderlich aus
Ich würde mich über Tips und Hilfe sehr freuen
0
planetexpress69
planetexpress6910.10.0513:31
Richtig, das gehört auch in die onshow Methode... Genau wie das (Re-)Initialisieren des Timers...
0
bald10.10.0514:18
planetexpress69
Richtig, das gehört auch in die onshow Methode... Genau wie das (Re-)Initialisieren des Timers...

...ehm, versteh ich nicht?:-/
Das Reinitialisieren des Timers etc. aus dem Bsp-Code ganz oben, verwende ich inzwischen gar nicht (ich hab’s anders gelöst). Meine Frage ist ja nun im Prinzip eine völlig andere, nämlich wie man es anstellt, dass eine Bild-id beim Aufrufen des Widgets (bzw. beim Einblenden des Dashboards) neu geladen wird...
Das muss doch recht simpel per Javascript zu lösen sein

Es gibt ja sowas wie "...window.location.relaod()...", kann man sowas nicht für eine Bild-id bestimmen? So in der Art "...image.location.reload()..." ???

Erneut würde ich mich über Ratschläge sehr freuen!
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.