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

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
knr
Piegowaty Guziec
Piegowaty Guziec
Posty: 4
Rejestracja: 29 mar 2005, 13:18
Płeć: Mężczyzna
Wersja Ubuntu: 7.10
Środowisko graficzne: GNOME
Kontakt:

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

Post 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.
Hate It Or Love It (!!!)
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość