Schrift
[thread]4928[/thread]

fileevent: Habe Code fertig



<< >> 7 Einträge, 1 Seite
Froschpopo
 2005-04-10 16:44
#43420 #43420
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
diesmal könnt ihr mich nicht hinweisen, ich hätt mal die perldoc lesen sollen...
also folgendes: Ich will nen Ping in echtzeit in ein Textwidget schreiben. Da das Programm auch noch andere dinge tun soll, will ich das ganze mit nem fileevent machen.
mein code sieht so aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/perl

use warnings;
use Tk;

open(PING, "ping 127.0.0.1 -t |")
or die "Fehler: $!\n";

my $mw = MainWindow->new();

my $t = $mw->Text(-width => 80, -height => 25, -wrap => 'none');

$t->pack(-expand => 1);

$mw->fileevent(\*PING, 'readable', [\&print_widget, $t]);

MainLoop;

sub print_widget {

my($widget) = @_;

$_ = <PING>;
print $_;
$widget->insert('end', $_);
$widget->yview('end');

}


Es gibt keine Fehlermeldung, es scheint irgendwie vom Syntax richtig zu sein. Allerdings füllt er das Textwidget nicht. Wieso?
betterworld
 2005-04-10 17:24
#43421 #43421
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
4
5
6
ping 127.0.0.1 -t
ping: option requires an argument -- t
Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
[-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
[-M mtu discovery hint] [-S sndbuf]
[ -T timestamp option ] [ -Q tos ] [hop1 ...] destination
Froschpopo
 2005-04-10 17:41
#43422 #43422
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
nö funzt bei XP auch so ! Die Pipe funktioniert prima wenn ich PIPE in einer schleife auf der dos-konsole ausgebe !

Aber darum gehts ja garnicht, ich bekomme das Ergebnis nicht ins Event bzw in das Textwidget\n\n

<!--EDIT|Froschpopo|1113140531-->
coax
 2005-04-10 20:00
#43423 #43423
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Bei mir landet die Ausgabe im Textwidget (nachdem ich das -t entfernt habe), bekommst du ueberhaupt etwas auf der Standardausgabe angezeigt ?

Kennst du Net::Ping (plattformunabhaengig pingen)?
,,Das perlt aber heute wieder...'' -- Dittsche
Froschpopo
 2005-04-11 03:31
#43424 #43424
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ist eigentlich egal ob ich ping oder einfach nur dir mache. Er schreibt generell nichts ins Textwidget. Ich use Windows XP

wenn ich aber den ping z.B. in der cmd ausgebe klappt alles... muss also am fileevent liegen\n\n

<!--EDIT|Froschpopo|1113175926-->
Froschpopo
 2005-04-11 04:11
#43425 #43425
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ich hab vorhin gelesen, dass es unter Windows nur mit Sockets funktioniert. Mein Test ergab aber auch nichts:
Das event wird garnichterst ausgeführt. Es gibt keine Fehlermeldung, er ignoriert es einfach !
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl

use warnings;
use Tk;
use IO::Socket;

my $input = IO::Socket::INET->new (
    PeerAddr => '127.0.0.1',
    Type => SOCK_STREAM,
    PeerPort => 2006,
    Proto=>"tcp"
) or die "kann Server nicht kontaktieren\n";

my $mw = MainWindow->new();

$mw->fileevent($input, 'readable', sub {
    $mw->configure(-title => "Es funktioniert")
});
close($input);
MainLoop;
\n\n

<!--EDIT|Froschpopo|1113184710-->
ptk
 2005-04-11 19:49
#43426 #43426
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Du musst dir klar werden, was event-basiertes Programmieren bedeutet. Hier schliesst du den Socket, bevor du in die MainLoop gehst. Fileevent kann aber nur in der MainLoop reagieren. Es sieht auch so aus, als ob man fileevent() erst nach Starten der MainLoop aufrufen kann. Am besten ist es, wenn du:
Code: (dl )
1
2
3
$mw->afterIdle(sub {
$mw->fileevent(...)
});

schreibst.
<< >> 7 Einträge, 1 Seite



View all threads created 2005-04-10 16:44.