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;
Pozdrawiam serdecznie.