PDA

Visualizza la versione completa : Finestra perl/tk non risponde


monster77
12-03-2009, 10:01
Ciao a tutti,
premetto che non sono un programmatore ma da qualche tempo eseguo semplici script in perl che elaborano file o interrogano database. In questi giorni mi sto avvicinando a Perl/tk per inserire questi script in finestre windows in modo da poter aggiungere bottoni, listbox ecc... e rendere così l'applicazione più interattiva ma mi scontro con un problema che non riesco a risolvere in nessun modo. Oggi questi script ciclano in continuazione scanditi da alcuni sleep posti nello script e quando li integro in finestre GUI queste mi si bloccano finchè il tempo impostato nello sleep non è trascorso.
Inserisco un esempio per farvi capire meglio e spero che qualcuno sappia aiutarmi....

Grazie a tutti.

use Tk;

$mw = MainWindow->new;
$mw->title('text');

$lb = $mw->Scrolled('Text',-width => 40,-height => 16,-background => yellow,-font => 'Tahoma 10 bold',-scrollbars => 'osow');

$lb->tagConfigure('BLUE',-foreground => 'blue');
$lb->tagConfigure('LTBLUE',-foreground => 'light blue');
$lb->tagConfigure('RED',-foreground => 'red');
$lb->tagConfigure('GREEN',-foreground => 'green');
$lb->tagConfigure('LTRED',-foreground => 'orange');
$lb->tagConfigure('LTGREY',-foreground => 'light grey');
$lb->tagConfigure('YELLOW',-foreground => 'yellow');

$via = $mw->Button(-text => 'Start',-width => 4,-height => 1,-font => 'Tahoma 15 bold',-command => \&message);
$exit = $mw->Button(-text => 'Exit',-width => 4,-height => 1,-font => 'Tahoma 15 bold',-command => [$mw => 'destroy']);

$lb->pack;
$via->pack(-side => 'left',-expand => 1);
$exit->pack(-side => 'left',-expand => 1);
MainLoop;

sub message {
INIZIO:
{
while ($message<5)
{
$message++;
$lb->insert('end', $message."\n", 'RED');
$lb->update;
sleep 5;
}
$message="prova"."\n";
$lb->insert('end', $message,'BLUE');
$lb->update;
sleep 5;
redo INIZIO;
}
}

shishii
12-03-2009, 23:00
ma quale sarebbe il problema?

monster77
13-03-2009, 08:30
Il problema è che quando hai avviato la sub dal pulsante "start" e quindi si avvia il ciclo di conteggio l'aplicazione non risponde più quando arriva allo sleep, nel senso che non posso spostare la finestra ne chiuderla e nemmeno premere il pulsante "exit".
Ho gia provato a fare di tutto con after, con DoOneEvent ma non so.....
Ora quello è un esempio, immagina che al posto del ciclo di conteggio io debba inserire una query su un database che gira ogni 30 minuti e che invia una e-mail con il risultato.
Probabilmente sbaglio anche la logica di programmazione però deve esserci un modo per far si che perl mi ridia il controllo della finesta quando la clicco per muoverla o se devo premere exit per chiuderla.

Mi sembra che in vb ci sia un comando DoEvents che rilascia temporaneamente ad ogni ciclo di cpu il controllo alla macchina del programma in modo che risponda agli eventi esterni anche se sta lavorando.

Spero di essermi spiegato un po' meglio ma devi scusarmi faccio fatica anche a trovare la terminologia da programmatore adatta per agevolare un possibile aiuto e per risolvere il vero problema.

Grazie ancora per il tuo aiuto.

shishii
14-03-2009, 22:09
Non conosco bene le librerie Tk per cui non so darti risposte che derivino da loro.

Penso comunque che si potrebbe fare eseguire il codice che ti blocca lo script sotto un processo figlio ovvero dopo una chiamata "fork", in quanto ciò che fa il filgio non influenza il processo padre, ovvero la finistra.

monster77
16-03-2009, 12:34
Ho letto anch'io che si può usare il fork o threads ma non ci capisco un tubo, non hai qualche piccolo esempio perchè quelli che trovo non li capisco.

Grazie

shishii
16-03-2009, 20:09
hai provato a leggere questo?

http://pod2it.sourceforge.net/pods/perlfork.html

qui c'è un esempio base:

http://www2.units.it/~mumolo/PERL.ppt

Loading