Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8722[/thread]

Programmstatus zyklisch feststellen



<< >> 4 Einträge, 1 Seite
Stevee
 2007-02-05 12:23
#74003 #74003
User since
2006-10-17
5 Artikel
BenutzerIn
[default_avatar]
Hallo Freunde,
Ich möchte ein Skript erstellen, dass
a) eine bestimmte Aufgabe erledigt und
b) für die Dauer dieser Aufgabe Punkte auf dem Terminal ausgibt.

Mein bisherige Idee:
Ich schicke die Aufgabe "Schlafe 3 sek. und setze dann $x auf 1" mit fork in den Hintergrund.
Unmittelbar darauf werden so lange Punkte ausgegben, bis $x auf 1 gesetzt wird. Nur bekommt das meine while-Schleife nie mit. Die while-Schleife ist also endlos. Ich möchte aber, dass mein Skript nach 3s endet und in dieser Zeit ein Paar Punkte gemalt werden.

Hat jemand einen geschickteren Ansatz?

Hier mein bisheriger Versuch:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
$| = 1;
$x = 0;

$pid1 = fork;
unless ($pid1)
{
sleep (3);
$x = 1;
exit;
};

while ($x == 0)
{
 print ".";
 select(undef, undef, undef, 0.02);
}


Edit: Code-Tags von betterworld.\n\n

<!--EDIT|betterworld|1170679353-->
pq
 2007-02-05 14:46
#74004 #74004
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
use IO::Select;
print "($$) parent\n";
$| = 1;
my $timeout = 1;
if ( my $pid = open my $fh, "-|" ) {
   print "($$) opened $pid\n";
   my $s = IO::Select->new;
   $s->add($fh);
   my $ready;
   while (not(($ready) = $s->can_read($timeout))) {
       print ".";
   }
   print $/;
   chomp, print "($$) got ($_) from child\n" while <$ready>;                                        
}
elsif (defined $pid) {
   sleep 3;
   print "($$) i am the child and i finished my work\n";
exit;
}


wohl bekomm's

edit: else durch elsif aufgetauscht\n\n

<!--EDIT|pq|1170679725-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
betterworld
 2007-02-05 14:47
#74005 #74005
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Für die Punkte kannst Du vielleicht CPAN:Term::ProgressBar nehmen.

Bei fork solltest Du ueberpruefen, ob der Rueckgabewert undef ist. In dem Fall hat der fork naemlich fehlgeschlagen und Du bist immer noch im vorherigen Prozess.

$x auf 1 zu setzen und dann exit bringt ungefaehr ueberhaupt nichts. Gehst Du davon aus, dass der andere Prozess dann auch das geänderte $x sieht? Das ist aber nicht so. Wenn Du das moechtest, brauchst Du Threads.
Stevee
 2007-02-06 11:37
#74006 #74006
User since
2006-10-17
5 Artikel
BenutzerIn
[default_avatar]
Danke nochmals für die Tipps.
Term::ProgressBar ist wohl das richtige für mich.
<< >> 4 Einträge, 1 Seite



View all threads created 2007-02-05 12:23.