Strona 1 z 1

Perl/Tk MainLoop i pętla bez interakcji użytkownika.

: 30 paź 2008, 22:11
autor: knr
Witam!
Mam do napisania mały, prosty program. Jestem kompletnie początkujący.
Zdecydowałem się na Perl + Tk do GUI.
Mam jednak problem i nie mogę wygoglować nic rozsądnego.
Wygląda to tak, mam kod który zaciąga z pliku tekstowego trzy atrybuty ID, IP, OPIS.
Plik tekstowy ma format ID:IP:OPIS.
Kod wysyła pinga na każdy z IP i jeśli dostanie odpowiedz icmp to wyrzuca IP OPIS, jeśli icmp nie odpowie to generuje to samo (IP OPIS), ale w kolorze czerwonym.
Cel jest jasny, kod też raczej banalny (wklejam poniżej) ale mam problem z MainLoop.
Po pierwsze GUI pokazuje się dopiero po "dojechaniu" do MainLoop (czyli po wykonaniu wszystkich pingów), po drugie nie wiem jak zmusić pętle pingającą żeby po MainLoop dalej się wykonywała, tzn żeby się wykonywała owszem ale żeby wysyłała rezultaty do GUI to już nie. Efekt jest taki że (kolejno):

1. Program wysyła wszystkie pingi jeden raz;
2. Tworzy GUI i wyświetla w nim wszystkie efekty;
3. Zatrzymuje się i nie chce dalej prowadzić "badania icmp".

Będę bardzo wdzięczny jeśli ktoś mi podpowie jak rozwiązać ten problem, no i super gdyby ktoś wytłumaczył mi "anatomie" MainLoop, bo kompletnie nie rozumiem tej idei :(

Kod: Zaznacz cały

#!/usr/bin/perl
use Tk;
use Net::Ping;
open(PLIK, "/home/user/.ping.pl/ipki") || die "Brak pliku do zaladowania!";
my $mw = new MainWindow;
while ($scalar = <PLIK>) {
@tabela = split(/:/, $scalar);
$id = @tabela[0];
$addr = @tabela[1];
$opis = @tabela[2];
my $frame_1 =$mw -> Frame(-border=>0)->pack();
my $frame_2 =$mw -> Frame()->pack();
my $fra1 = $frame_1 -> Text(-width=>15, -height=>1, -borderwidth=>0) -> pack(-side => 'left');
my $fra2 = $frame_1 -> Text(-width=>35, -height=>1, -borderwidth=>0) -> pack(-side => 'right');
$fra1->tagConfigure('bold', -font => "Sans 8", -foreground => "red");
$fra2->tagConfigure('bold', -font => "Sans 8", -foreground => "red");
die unless ($scalar);
my $pg = Net::Ping->new('icmp');
if ($pg->ping($addr)) {
	chomp $addr;
	chomp $opis;
	print "OK\t $addr\t$opis\n";
	$fra1 -> insert("end","$addr\n");
	$fra2 -> insert("end","$opis\n");
} else {
	chomp $addr;
	chomp $opis;
	print "ER\t $addr\t$opis\n";
        $fra1 -> insert("end","$addr\n", 'bold');
        $fra2 -> insert("end","$opis\n", 'bold');
}
$pg->close();
}
MainLoop;
Znalazłem w sieci opisy z kodem po MainLoop, niestety to zawsze są buttony a ja chce żeby pingi wykonywały się bez interakcji z mojej strony, bez duszenia w przycisk, tylko same z pętli albo jakoś :/
Pozdrawiam serdecznie.