Thread Tk --> parallel zur Konsolenanwendung (8 answers)
Opened by Lebowski at 2011-07-10 15:25

topeg
 2011-07-10 22:28
#150278 #150278
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Ein Beispiel auf dem Terminal. Es wird ein Fortschrittsbalken erzeugt, der 0-100% geht. Dahinter wird als Spielerei die aktuelle Zeit angezeigt. Die Ausgabe wird wahrscheinlich nur in einem richtigen Terminal gut funktionieren. (Ich benutze "\r" um den Kursor wieder an den Anfang der Zeile zu setzen)
more (12.5kb):
Code (perl): (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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/usr/bin/perl
use strict;
use warnings;
use POSIX ":sys_wait_h";
use IO::Handle;

my $timeout=5;
my $output='';
my $bsize=63;

# Interface:
# zuerst die Gesammtzahl der Punkte die kommen werden als Zahl beendet mit "\n"
# danach die Punkte.

# Beispiel:
my $cmd=q!perl -e '
$|=1;
$x=111;
print "$x\n";
for(0..$x)
{
  print ".";
  select(undef,undef,undef,rand(1));
}
'!;

{
  my $pid=open(my $ph, '-|', $cmd) or die("ERROR START $cmd ($!)\n");

  # die Anzhal der kommenden Punkte einlesen
  my $size=<$ph>;
  chomp($size);

  # handle ist nicht blockierend!
  $ph->blocking(0);
  my $cnt=0;
  # Ausgabe nicht puffern
  local $|=1;

  # wenn der prozes noch läuft
  # und noch nicht alle Punkte gesendet wurden.
  while(waitpid($pid, WNOHANG) == 0 && $cnt<$size)
  {
    # versuche zu lesen
    # ist nicht blockierend!
    my $dots=<$ph>;
    # etwas gelesen?
    if($dots)
    {
      # die Punkte zählen
      my $c=($dots=~y/././);
      # zähler erhöhen
      $cnt+=$c;
    }

    # prozent errechnen
    my $percent=(100/$size)*$cnt;
    # balken erzeugen
    my $line=substr(('='x(($bsize/$size)*$cnt))."|".(' 'x$bsize),0,$bsize);
    # aktuelle Zeit (hacky)
    my $time=substr(localtime(),11,8);
    # alles ausgeben
    printf "\r% 3u%% [%s] %s", $percent, $line, $time;

    # bischen warten
    select(undef,undef,undef,0.2)
  }
  close($ph);
  print "\n";
}

Last edited: 2011-07-11 00:05:38 +0200 (CEST)

View full thread Tk --> parallel zur Konsolenanwendung