Schrift
[thread]322[/thread]

kleiner Timer: geht das?



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
Gast Gast
 2004-07-10 00:30
#3114 #3114
Hallo.
Ich bin ein totaler Perl-Noob und sollte eine Art Timer basteln.
Ich habe das folgendermassen gelöst:
start.pl
Ruft timer.pl auf und kann danach geschlossen werden.
timer.pl
enthält folgendes:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
print "Content-type: text/plain\n\n";

$value = 60; #sekunden
$loop = 0; #wiederholungen
$c_file = "run.txt"; #kontrollfile


if($loop>=1)
{
for($i=0;$i<$loop;$i++)
{
sleep $value;

system("$perl_path action.pl");
}
}
else
{
while(-e $c_file)
{
sleep $value;

system("$perl_path action.pl");
}
}

action.pl
Macht irgendwas :D

Es funktioniert eigentlich ganz gut, allerdings läuft Perl die ganze Zeit über (auch wenn es/er schläft). Ich weiss jetzt nicht ob das Performance kostet und wollte daher mal nachfragen und mich bei Gelegenheit eines Besseren belehren lassen :)
Danke!
[E|B]
 2004-07-10 00:37
#3115 #3115
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Wieso baust du für einen Timer drei Scripts?? Eins würde doch völlig genügen.
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
Crian
 2004-07-10 00:45
#3116 #3116
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ich glaube es ist besser, mit alarm oder anderen Mitteln (cron, at) Skripte zu einer bestimmten Zeit zu starten, als mit Sleep explizit zu schlafen, da es dabei noch Resourcen verbraucht IIRC.

Wenn Du unter einem unixartigen Betriebssystem arbeitest, schau Dir doch mal cron, at oder Chronic.pm an (ich hab mir das Modul immer noch nicht angesehen, schande über mich), diese geben Dir alternative Möglichkeiten, zu einem bestimmten Zeitpunkt oder zu gegebenen Bedingungen Skripte zu starten.

Ev. kannst Du in Deiner mehrere-Skripte-Lösung auch im ersten Skript das dritte in die at-Liste eintragen lassen und das zweite Skript weglassen.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
steffenw
 2004-07-10 00:46
#3117 #3117
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Dein Script sollte immer mit
Code: (dl )
1
2
use sctrict;
use warnings;
beginnen.

Eine Laufvariable brauchst Du nur, wenn Du auch etwas indizieren willst. Also schreibe anstatt
Code: (dl )
for (my $i=0; $i<$loop; $i++)
folgenden
Code: (dl )
1
2
3
for (0 .. $loop-1)
# oder
for (1 .. $loop)

Verzögerungszeiten im Sekundenbereich mache mit
Code: (dl )
sleep($sekunden);

kleinere Zeiten oder z.B. auch 5.7 erreicht man mit
Code: (dl )
select(undef, undef, undef, $sekunden_aber_float);


ergänzt: Meinen Vorrednern, die zwischenzeitlich auch geantwortet haben, kann ich nur zustimmen. Von der Seite her hatte ich mir das Script nicht angeschaut\n\n

<!--EDIT|steffenw|1089406182-->
$SIG{USER} = sub {love 'Perl' or die};
jan
 2004-07-10 00:54
#3118 #3118
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
Quote
kleinere Zeiten oder z.B. auch 5.7 erreicht man mitCode
Code: (dl )
select(undef, undef, undef, $sekunden_aber_float); 


oder mit CPAN:Time::HiRes und der dort enthaltenen Funktion usleep
rave!
 2004-07-10 01:00
#3119 #3119
User since
2004-07-10
1 Artikel
BenutzerIn
[default_avatar]
Das ging ja fix.
Zum ersten, von nem Moderator hätt ich mir was sinnvolleres erwartet :D
Zu den 3 Files: Das Fenster vom ersten Script wird nach dem Aufruf geschlossen und das war die einzige Art auf der ich es mit meinem sehr begrenzten Wissen fertiggebracht habe.
@Crian
Danke, werds mir morgen früh gleich ansehen, wobei ich cron soweit ich weiss nicht benutzen soll (ka wieso, muss nochmal nachfragen).
Wenns nicht zuviel Aufwand ist, möcht ich vielleicht wissen wie ich das anstelle, mit at im ersten und es trotzdem zumachen darf (vielleicht gehts ja ganz einfach..).
@steffenw
Das $i hat anundfürsich schon seine Richtigkeit, da es im vollständigen Skript gebraucht wird, aber trotzdem danke. Das mit my und use .. ist sicher auch gut zu wissen...
Ich komme aus dem PHP bereich und habe eben so programmiert wie ich es gewohnt bin :) und eigentlich bin ich recht zufrieden nach meinen ersten 2 Stunden Perl.
Danke nochmal an alle. :laugh:

PS: Meine Zeiten sind wesentlich grösser, ca 15min und mir ist auch klar wie ungünstig meine Lösung ist, sonst hätt ich ja nicht nachgefragt. N8
steffenw
 2004-07-10 01:22
#3120 #3120
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
in Perl brauchst Du das $i fast nie, weil es Aliasing gibt. Es gibt Ausnahmen, wenn man gleichzeitig mit einem $i zwei Arrays gleichzeitig ansprechen will, oft ist aber dann auch das überflüssig, weil man ein Array nimmt, und einen Hash ankoppelt, der für jedes Arrayelement eben diesen Hashs hat und man dort auf die 2 unterschiedlichen Dinge zugreifen kann. Zugreifen, das ist der Vorteil von Hashes in Datenstrukturen, das ist vieeeeel performanter als das ewige Suchen in Arrays, so wie man das aus anderen Programmiersprachen her kennt.
$SIG{USER} = sub {love 'Perl' or die};
jan
 2004-07-10 01:29
#3121 #3121
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
naja, aber eine for-schleife mit zähler ist oft schon sinnvoll, gerade wenn man zB die verarbeitung eines elementes davon abhängig machen will, wie das nächste element beschaffen ist. oder dann zB entsprechend der beschaffenheit eines elements mehrere elemente überspringen will. oder nur jedes Xte element bearbeiten will. oder oder oder, also mir laufen oft dinge über den weg, die sich meiner meinung nach am einfachsten so lösen lassen.
wie meinst du das mit dem hash? so, dass man immer eine reverse-ordnung hat, à la
my @array = ('null', 'eins', 'zwei');
my %hash = ('null' => 0, 'eins' => 1, 'zwei' => 2);
?
esskar
 2004-07-10 03:41
#3122 #3122
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Arbeitest du unter Windows oder *nix?
Anscheinend ist das ganze auch kein CGI Programm, oder? Sonst würdest du nicht von Fenstern reden. Wenn es kein CGI ist, dann kannst du die Zeile
Code: (dl )
print "Content-type: text/plain\n\n";
nicht
[E|B]
 2004-07-10 18:17
#3123 #3123
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Quote
Zum ersten, von nem Moderator hätt ich mir was sinnvolleres erwartet


Ich lass die User halt gerne zappeln. :p :D
Das war eigentlich nur ein Kommentar, dass es der erste Lösungsvorschlag quatsch ist.
Zurück zum Thema:
Prinzipiell wurde schon das wichtigste genannt.

Code: (dl )
sleep(5) for (1..5);


Lässt deinen Code 5*5 Sekunden schlafen.
Ansonsten schau dir mal Schedule::Cron oder Time::HiRes an.
Schedule::Cron ist was ganz feines. Es führt Perl Subroutinen periodisch aus (anlehnend an Cron).\n\n

<!--EDIT|[E|B]|1089469095-->
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2004-07-10 00:30.