Bonjour à tous,
je vais essayer d'expliciter clairement mon pb (pas comme avec ce titre calamiteux!)
Le but de la manoeuvre est d'ouvrir à partir d'une interface en perl/tk une application, par exemple "nedit" ou tout autre éditeur de texte.
Je donne au thread un argument, par exemple $toto = 1 et quand j'appuie sur le bouton qui lance le thread, la commande "nedit toto1" (avec 1 venant de $toto) est exécutée.
Jusque là, tout va bien. La fenêtre s'ouvre.
Je voulais savoir s'il était possible avec le même thread d'ouvrir une 2ème fois l'éditeur (ou une application quelconque) en envoyant une autre valeur pour $toto (par exemple 2)?
Voici le bout de code pour faire le test
Les radio boutons permettent bien entendu de choisir la valeur de $toto à fournir au thread.
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
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 #!/usr/bin/perl use strict; use warnings; use Tk; use threads; use threads::shared; my %LesFonctions=("toto"=>\&toto); my $ThreadTravail : shared; my $TuerThread : shared; my $nomFonction : shared; my @ArgumentsThread : shared; my $Thread = threads->create(\&MonThread); my $toto='1'; $ThreadTravail=0; $TuerThread=0; my $mw = MainWindow->new; $mw->protocol('WM_DELETE_WINDOW' => sub{ $Thread->detach(); $TuerThread=1; sleep 1; exit}); $mw->Button(-text=>'toto', -command=> sub {&majThread})->pack(); #$mw->Button(-text=>'exit', -command=> sub { exit })->pack(); $mw->Radiobutton(-text=>'1', -variable=>\$toto, -value=>'1')->pack(-side=>'left'); $mw->Radiobutton(-text=>'2', -variable=>\$toto, -value=>'2')->pack(-side=>'left'); $mw->Radiobutton(-text=>'3', -variable=>\$toto, -value=>'3')->pack(-side=>'left'); MainLoop; sub MonThread{ while (1) { if ( $ThreadTravail == 1 ) { $LesFonctions{$nomFonction}->(@ArgumentsThread); $ThreadTravail = 0; } last if ( $TuerThread == 1 ); sleep 1; } return; } sub majThread { $nomFonction ="toto"; @ArgumentsThread =($toto); $ThreadTravail = 1; } sub toto{ my $toto = $_[0]; system("nedit toto$toto") }
Premier clic sur le bouton toto, l'éditeur s'ouvre. Choix d'une autre valeur et 2ème clic sur le bouton, rien ne se passe. Normal.
Si je crée un second thread, je pense que je peux ouvrir 2 éditeurs, avec un troisième, trois éditeurs... Mais je voudrais éviter d'avoir à générer (si c'est techniquement possible) un thread à chaque clic sur le bouton toto...
Merci d'avance
Partager