process probléme - Perl - Programmation
Marsh Posté le 07-10-2010 à 11:19:24
La doc du module Win32::Process est explicite pourtant:
$ProcessObj->Suspend() et $ProcessObj->Resume() pour interrompre et reprendre, ou sinon $ProcessObj->Kill( ... ) pour l’arrêter définitivement, ça marche pas?
A+,
Marsh Posté le 07-10-2010 à 11:45:23
Par contre, ce que tu fais me semble pas très bon:
Win32::Process::Create($ProcessObj, "c:\\Windows\\system32\\cmd.exe", "voiture_v8.exe $argument1 $argument2", ...)
Ça devrait être Win32::Process::Create($ProcessObj, "c:\\...\\voiture_v8.exe", "$argument1 $argument2", ...)
avec le bon path complet pour voiture_v8.exe, car je vois pas l'intérêt de passer par un shell intermédiaire.
A+,
Marsh Posté le 10-10-2010 à 21:15:24
Merci beaucoup gilou pour l’aide je vais essayer d’appliquée ce que tu ma indiqué par contre je souhaite avoir la possibilité de lancé les scripts extérieur en les mettons dans n’importe quelle endroit dans le disque est le fait d’indiqué exactement le chemin ne permet plus de faire ca y’a il une solution pour pouvoir lancé les scripts sans indiqué un chemin exact (a parir d’un disque dur externe ou autre)
Marsh Posté le 11-10-2010 à 12:41:35
La solution, c'est de faire comme le système: récupérer le path système, de regarder pour chaque composant du path, si le programme voulu est dans le répertoire, et si oui, on a alors le path absolu à utiliser.
Il y a un module qui doit faire cela: File::SearchPath. Je l'ai jamais utilisé, mais au vu de la doc, ça devrait coller.
A+,
Marsh Posté le 12-10-2010 à 23:40:41
Bonjour gilou , je te remercie enormement pour les solution.
comme je suis encore debutant en perl j'ai un peut de mal a appliqué la doc des module.
mon problem est que aprés avoir creé le boutton stop je c'est pas quelle commande utiliser pour faire le Kill. peut tu m'aider
voici le code
#!/usr/bin/perl
use strict;
use warnings;
use Win32;
use Win32::Process;
use Tk;
use Cwd;
require Tk::BrowseEntry;
my $mw = MainWindow->new(
-title => "bm",
-background => 'white',
);
$mw->minsize( 500, 500 );
my $frame = $mw->Frame()->pack(qw/ -pady 10 -padx 10 /);
my ( $argument1, $argument2 );
my $BrowseEntry1 = $frame->BrowseEntry(
-label => "name : ",
-variable => \$argument1,
)->pack(qw/ -side left -padx 10 /);
my $BrowseEntry2 = $frame->BrowseEntry(
-label => "n : ",
-variable => \$argument2,
-choices => [ "1", "2" ],
)->pack(qw/ -side right -padx 10 /);
my $BoutonLancementProg = $mw->Button(
-text => "lancer prog",
-command => [ \&voiture, \$argument1, \$argument2 ],
)->pack();
my $killProg = $mw->Button(
-text => "Stop",
-command => , ###### c'est quoi comme commande
)->pack();
MainLoop;
sub voiture {
my ( $Refargument1, $Refargument2 ) = @_;
my ( $argument1, $argument2 ) = ( ${$Refargument1}, ${$Refargument2} );
print "Argument 1 : : $argument1\n" if ( defined $argument1 );
print "Argument 2 : : $argument2\n" if ( defined $argument2 );
if ( defined $argument1 and defined $argument2 ) {
#system("voiture_v8.exe $argument1 $argument2" );
sub ErrorReport{
print Win32::FormatMessage( Win32::GetLastError() );
}
my $ProcessObj;
Win32::Process::Create($ProcessObj,
"h:\\Script\\voiture_v8.exe",
"voiture_v8.exe $argument1 $argument2",
0,
NORMAL_PRIORITY_CLASS,
"." )|| die ErrorReport();
my $exitcode;
$ProcessObj->Kill($exitcode)
}
else {
warn "Les 2 arguments ne sont pas ok\n";
}
return;
Marsh Posté le 13-10-2010 à 16:12:35
Ben le $ProcessObj->Kill($exitcode) n'a rien a faire après le Win32::Process::Create je pense (a moins que cette dernière fonction ne retourne qu'après l’exécution du process).
Par contre, c'est ça que tu veux appeler dans ta commande killprog.
A+,
Marsh Posté le 13-10-2010 à 21:34:11
Je veux pouvoir stopper le process par un simple click sur le bouton ‘stop’ , comme tu ma indiqué avant et comme c’est indiqué dans la doc j’essaye d’utiliser la fonction $ProcessObj->Kill( ... )
Mais je n’arrive pas à l’implémenter et je ne trouve pas d’exemple qui ressamble a ce que je veut faire ,peut tu stp m’aider a faire cette fonction
Le but est a l’appui sur le bouton ‘stop’ le process s’arréte sans fermer le programme
Marsh Posté le 14-10-2010 à 02:06:35
Citation : j’essaye d’utiliser la fonction $ProcessObj->Kill( ... ) |
Elle est pas à implémenter, cette fonction, elle est juste à appeler à l'appui du bouton stop.
Citation : Le but est a l’appui sur le bouton ‘stop’ le process s’arréte sans fermer le programme |
Lequel? voiture_v8.exe ou le script perl?
Si c'est de voiture_v8.exe qu'il s'agit, alors il faudrait peut être parler français, hein: c'est interrompre le processus, pas l'arrêter!
Dans ce cas la, c'est bien entendu pas $ProcessObj->Kill( ... ) qu'il faut appeler, mais $ProcessObj->Suspend() [et $ProcessObj->Resume() pour reprendre l'exécution du processus]
A+,
Marsh Posté le 06-10-2010 à 21:47:26
Bonjour a tous
J’ai besoin de votre aide pour résoudre un problème
je suis débutant en perl donc toute suggestion ou aide peut me faire avancé et merci d’avance.
J’utilise un programme perl tk pour lancé d’autre script .mon problème est que je veux avoir la possibilité de stoppé l’exécution du script via un bouton « stop » le problème est que j’ai pas la main, des que je lance les scripts via le bouton je dois fermé l’application pour stoppé le processus, ce n’est vraiment pas trop pratique. Avez-vous des solutions à ce genre de problème ?
Avant pour lancé les script j’utiliser system , j’essaye de faire la meme chose avec le module win32 ::process .mais ca fonctionne pas. Voici le script :
sub voiture {
my ( $Refargument1, $Refargument2 ) = @_;
my ( $argument1, $argument2 ) = ( ${$Refargument1}, ${$Refargument2} );
print " $argument1\n" if ( defined $argument1 );
print " $argument2\n" if ( defined $argument2 );
if ( defined $argument1 and defined $argument2 ) {
#system("voiture_v8.exe $argument1 $argument2" ); encienne commande pour #lancer les script
#### utilisation de win32 ::process
sub ErrorReport{
print Win32::FormatMessage( Win32::GetLastError() );
}
my $ProcessObj;
Win32::Process::Create($ProcessObj,
"c:\\Windows\\system32\\cmd.exe",
"voiture_v8.exe $argument1 $argument2",
0,
NORMAL_PRIORITY_CLASS,
"." )|| die ErrorReport();
}
else {
warn "Les 2 arguments ne sont pas ok\n";
}
return;
}