IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Print + effacement + kill


Sujet :

Langage Perl

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Par défaut Print + effacement + kill
    Salut a tous,

    Pour mon programme de rip de dvd, j'utilise mplayer pour qu'il rogne les bandes noires, pour se faire j'utilise ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use IO::Pipe;
     
     
    print "       ATTENTION ! Pour sortir appuyez deux fois sur 'ECHAP' !\n";
    sleep 3;				
    my $d_cropp = new IO::Pipe();
    $d_cropp->reader("mplayer -dvd-device /mnt/loop dvd://3 -ao null -vo null -vf cropdetect -sb 50000000 -endpos 5001000o");
    {
    while( defined( my $line = $d_cropp->getline ) ) {									    
    	print	$line if $line =~ m/^.*CROP/;									   
    	}
    }
    Les deux problèmes sont d'une part, que l'utilisateur est obligé d'appuyer sur "echap" pour terminer la détection du rognage et d'autre part, que cette détection s'étend sur plusieurs lignes, exemple :

    [CROP] Aire coupée: X: 0..719 Y: 0..573 (-vf crop=720:560:0:8).0
    [CROP] Aire coupée: X: 0..719 Y: 0..573 (-vf crop=720:560:0:8).0
    [CROP] Aire coupée: X: 0..719 Y: 0..573 (-vf crop=720:560:0:8).0
    [CROP] Aire coupée: X: 0..719 Y: 0..573 (-vf crop=720:560:0:8).0
    [CROP] Aire coupée: X: 0..719 Y: 0..573 (-vf crop=720:560:0:8).0
    [CROP] Aire coupée: X: 0..719 Y: 0..573 (-vf crop=720:560:0:8).0
    [CROP] Aire coupée: X: 0..719 Y: 0..573 (-vf crop=720:560:0:8).0
    [CROP] Aire coupée: X: 0..719 Y: 0..573 (-vf crop=720:560:0:8).0
    [CROP] Aire coupée: X: 0..719 Y: 0..573 (-vf crop=720:560:0:8).0
    [CROP] Aire coupée: X: 0..719 Y: 0..573 (-vf crop=720:560:0:8).0
    [CROP] Aire coupée: X: 0..719 Y: 0..573 (-vf crop=720:560:0:8).0
    [CROP] Aire coupée: X: 0..719 Y: 0..573 (-vf crop=720:560:0:8).0
    [CROP] Aire coupée: X: 0..719 Y: 0..573 (-vf crop=720:560:0:8).0
    [CROP] Aire coupée: X: 0..719 Y: 0..573 (-vf crop=720:560:0:8).0
    [CROP] Aire coupée: X: 0..719 Y: 0..573 (-vf crop=720:560:0:8).0
    [CROP] Aire coupée: X: 0..719 Y: 0..573 (-vf crop=720:560:0:8).0
    Ce que j'aimerais faire c'est, dans un premier temps, que ca "print" que sur une seule ligne (comprendre il print la ligne commençant par [CROP], puis il l'efface et il reprint par dessus) et, dans un deuxième temps, envoyé un "kill" au processus après un certain temps.

    Note : Ceux qui connaissent un peu mplayer vont me dire d'utiliser les options "-sb/-ss" et "-endpos" afin de ne pas envoyer de signal kill, mais il se trouve que sur mon système ces options ont un comportement vraiment ... bizarre (les positions sont changeantes selon le dvd ).

    Alors, comment faire ?

    Jjeje007

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use IO::Pipe;
    $|++;
     
    # time before the kill() in seconds
    my $timeout = 60;
     
    print "       ATTENTION ! Pour sortir appuyez deux fois sur 'ECHAP' !\n";
    sleep 3;				
    my $d_cropp = new IO::Pipe();
    $d_cropp->reader("mplayer -dvd-device /mnt/loop dvd://3 -ao null -vo null -vf cropdetect -sb 50000000 -endpos 5001000o");
     
    my $itime = time();
    while( defined( my $line = $d_cropp->getline ) ) {
      chomp();						
      print	"$line\r" if $line =~ m/^.*CROP/;
      if( time() - $itime > $timeout ) {
        print "\n";
        kill(${*$d_cropp}{'io_pipe_pid'});
        $d_cropp->close();
        last;
      }
    }
    --
    Jedaï

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Par défaut
    Merci !! ça marche juste en corrigeant le :

    en :

    Voilà ce que ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #!/usr/bin/perl   
     
    use strict; 
    use warnings; 
    use IO::Pipe; 
    $|++;
     
    open(STDERR, ">error.log" ) or die "Impossible de rediriger STDERR vers le fichier de log : $!\n";
     
    # time before the kill() in seconds 
    my $timeout = 15;
     
    print "INFO : Détection du rognage optimal en cours (15 secondes)...\n"; 
    my $d_cropp = new IO::Pipe(); 
    $d_cropp->reader("mplayer -dvd-device /mnt/loop dvd://1 -ao null -vo null -vf cropdetect -sb 50000000");   
     
    my $itime = time();
    while( defined( my $line = $d_cropp->getline ) ) {  
    	chomp ($line);
    	print "$line\r" if $line =~ m/^.*CROP/; 
    	if( time() - $itime > $timeout ) {
    		print "\n";
    		kill(${*$d_cropp}{'io_pipe_pid'}); 
    		$d_cropp->close(); 
    		last; 
    		} 
    	}
    Merci beaucoup de ton aide (en fait c'est toi qui l'a écrit ce programme )

    Une dernière question concernant le :

    Suis-je obligé de le mettre à chaque fois ou je le mets une seule fois au début du script ?
    Et, si je suis obligé de le mettre à chaque fois, dois-je le remettre "en paramètre d'origine" et comment ?
    Enfin, quel incidence ceci peut avoir sur le script ?

    Oups, ça fait plus qu'une question tout ça

    Jjeje007

  4. #4
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    $|++; active l'autoflush sur le filehandle actuellement select()ed (autrement dit celui sur lequel print() écrit par défaut, STDOUT la plupart du temps). Tu n'as besoin de l'écrire qu'une seule fois par script si tu veux activer l'autoflush sur STDOUT. Et sans autoflush, le "print "...\r"" serait bufferisé et l'affichage ne se ferait donc qu'au moment où "print "\n"" est utilisé, ce qui retirerait effectivement beaucoup de réactivité au programme.

    --
    Jedaï

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Par défaut
    Ok, merci de ces précisions
    Je viens de modifier mon script car j'avais mis des "$|++" a la pelle
    Apperement ca marche bel et bien juste avec un seul au tout début, mais j'ai pas encore tout testé.

    Jjeje007

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Print et Preview d'un rapport Rave
    Par joebarthib dans le forum Rave
    Réponses: 4
    Dernier message: 19/12/2002, 14h46
  2. Comment effacer des Items d'un TListView ?
    Par boyerf dans le forum Composants VCL
    Réponses: 4
    Dernier message: 11/11/2002, 10h19
  3. [VBA Excel] Effacer rapidement une feuille
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/10/2002, 13h12
  4. [CR] Print Engine error text
    Par afaraji dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 03/09/2002, 15h44
  5. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 14h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo