2013-10-17 4 views
1

J'ai une routine tk perl appel d'une procédure à partir d'un module perl importé. L'interface graphique se bloque pendant l'exécution du sous-programme. Voici l'extrait de code que j'utilise. Quelqu'un peut-il suggérer une meilleure façon de faire cela pour que l'interface graphique soit active pendant que la procédure est en cours?tk perl - comment garder l'interface graphique en vie lorsque la procédure l'intérieur du module Perl est en cours d'exécution

use Tk; 
use package1; 


$mw = MainWindow->new; 
$mw->geometry("+10+10"); 
$mw->title("My notebook GUI"); 
my $mwFrame = $mw->Frame(-borderwidth => 2, -relief => 'ridge')->pack(-fill=> 'none',-fil=> 'x'); 
my $nb = $mwFrame->NoteBook(-dynamicgeometry => 'true',-ipadx => 20, -ipady => 20)->pack(-expand => 1,-fill => 'both');    
$page1 = $nb->add('Page1',  -label => 'Page 1'); 
$page2 = $nb->add('Page2',  -label => 'Page 2'); 
    $page1->pack(); 
    $page2->pack(); 

    $button1 = $page1->Button(-text => "Not Selected", -background => 'gray', -state => 'disabled')->pack(-side => 'right', -expand => 0); 
    $button2 = $page2->Button(-text => "Not Selected", -background => 'gray', -state => 'disabled')->pack(-side => 'right', -expand => 0); 

    my $obj = package1->new(); 
    my $obj->run(); 

Dans le code ci-dessus, j'appelle la procédure d'exécution de package1 à exécuter. Alors que la procédure prend un certain temps, l'interface graphique se fige, ne me permettant pas de faire quoi que ce soit dessus. Je ne peux même pas aller d'une page à l'autre dans l'interface graphique du cahier.

Quelqu'un peut-il s'il vous plaît me guider? Je suis un perl newbie.

Merci.

+0

Pouvez-vous bourrer '$ mw-> mise à jour,' (ou les moins populaires 'mw- $> idletasks;') dans votre obj $? Ce post de Perlmonks l'explique mieux http://www.perlmonks.org/?node_id=574002 – charlesbridge

+0

Je peux essayer $ mw-> update; à partir de mon code principal après avoir appelé la sous-routine. Mais il ne met à jour la fenêtre principale qu'après le retour de la procédure. L'alternative est de pouvoir exécuter "$ mw-> update" à partir de la procédure elle-même. Maintenant, comment vais-je être capable de faire ça? –

Répondre

5

Bienvenue dans le monde de la programmation concurrente. D'une manière générale, il existe trois approches principales: ici

  1. Threads
  2. fourche/tube
  3. boucle multi-tâches coopératif/événement

Il y a des avantages et des inconvénients à chacun.

est ici one example en utilisant l'approche des fils; Je pense que cela pourrait vous être utile.

0

Je ne suis pas compétent avec moi-même tk, sauf pour quelques trucs de base, mais pourquoi voulez-vous courir ce sous à cet endroit? Normalement, je suppose que vous voulez un bouton ou un autre élément de l'interface utilisateur pour démarrer le sous-programme en utilisant une sorte de -command => {$obj->run()}. Ce qui devrait toujours fonctionner est cependant de débourser de votre programme principal pour l'exécution. Mais sans savoir ce que run() et $obj il est difficile de dire si les faire fonctionner en parallèle à votre boucle principale est possible.

+0

Non .. J'ai en fait le sous en cours d'exécution lorsque le bouton est cliqué. Par souci de simplicité, je n'ai pas inclus l'extrait de code ici. Mais même l'appel d'une procédure bloque l'interface graphique, que l'interface graphique l'appelle ou non. + –

+0

edit: En gelant, vous voulez dire que l'interface utilisateur de votre processus est irresponsable? Je pensais que vous vouliez dire qu'il a complètement gelé votre ordinateur. L'interface utilisateur ne répond pas parce que votre processus est occupé par le sous-marin, l'empêchant de s'occuper de toute autre chose ou même de mettre à jour l'interface utilisateur. Si vous voulez que votre Ui reste utilisable, vous devez gérer la concurrence vous-même avec l'une des méthodes suggérées par Mikko. Personnellement, je suggérerais forking comme c'est le moyen le plus simple (imho) et si vous souhaitez réduire les performances en gérant les threads à la main, vous ne devriez jamais avoir utilisé Perl en premier lieu. – DeVadder

Questions connexes