[patch] 02_RSS.pm - Performanceoptimierung

Begonnen von betateilchen, 24 April 2014, 14:14:07

Vorheriges Thema - Nächstes Thema

betateilchen


Index: 02_RSS.pm
===================================================================
--- 02_RSS.pm (Revision 5621)
+++ 02_RSS.pm (Arbeitskopie)
@@ -14,7 +14,11 @@
use feature qw/switch/;
use vars qw(%data);
use HttpUtils;
-require "98_SVG.pm"; # enable use of plotAsPng()
+#require "98_SVG.pm"; # enable use of plotAsPng()
+sub plotAsPng(@); # forward declaration will be enough
+  # to ensure correct function
+  # and will avoid reloading 98_SVG.pm
+  # during fhem startup/rereadcfg

my @cmd_halign= qw(halign thalign ihalign);
my @cmd_valign= qw(valign tvalign ivalign);
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Hallo,

mich stört auch, daß 98_SVG.pm zweimal geladen wird.

Wie wird aber ohne das require sichergestellt, daß das Modul überhaupt geladen wird? Es ist nämlich nicht in allen Fällen so, daß das Modul geladen ist, bevor es von plotAsPng() benötigt wird. Ich glaube, daß ich es sogar aufgrund einer Anwenderfehlermeldung erst eingebaut habe.

require lädt eine Library ja nur, wenn Sie nicht bereits geladen ist. Kann es sein, daß die Meldungen über das erneute Laden aus FileLog_loadSVG() kommen?

Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

Hallo Boris,

nein, das require hattest Du seinerzeit eingebaut, weil Du es für gut und notwendig angesehen hast (Mein Vorschlag damals war ja, diese Funktion in das RSS Modul einzubauen).

Du kannst mit plotAsPng aber nur einen plot einbinden, der bereits definiert ist. Und um einen plot per define in fhem verfügbar zu haben, muss das 98_SVG mindestens einmal geladen sein.

Zitatrequire lädt eine Library ja nur, wenn Sie nicht bereits geladen ist.

Stimmt - aber nur für die perl ebene.

require macht das sehr wohl. Aber wenn RSS vor dem ersten SVG geladen wird, weiss fhem beim ersten define <> SVG nicht, dass 98_SVG.pm bereits geladen ist, weil es zwar von perl geladen wurde, aber nicht von fhem und deshalb nicht in %modules enthalten ist. Deshalb lädt fhem das Modul beim ersten define eines SVG auf jeden Fall nochmal.

Im Prinzip geht es hier um ein Reihenfolgenproblem. Mit der Vorwärtsdeklaration der einzigen benötigten Funktion sollte das aber gelöst sein. Bei mir funktioniert das Ganze jedenfalls fehlerfrei. Ich werde heute abend auf einem Testsystem noch ausprobieren, wie sich das verhält, wenn ich die Reihenfolge bewußt verändere und ein RSS vor dem ersten SVG in der fhem.cfg definiert wird. Bin aber der Ansicht, dass ich das heute sogar schonmal so hatte.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Wie wäre es mit

sub
RSS_loadSVG()
{
  if(!$modules{SVG}{LOADED} && -f "$attr{global}{modpath}/FHEM/98_SVG.pm") {
    my $ret = CommandReload(undef, "98_SVG");
    Log3 undef, 1, $ret if($ret);
  }
}


und einem RSS_loadSVG() in RSS_Initialize()?

Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

Warum magst Du eigentlich einfache Lösungen nicht?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Testergebnis:

Meine eingangs vorgeschlagene Lösung funktioniert einwandfrei - egal in welcher Reihenfolge die Module geladen werden.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!