User since
2003-08-15
2653
Artikel
BenutzerIn
ich bin in einer ganz schwierigen Situation:
Ich muss ein Tk-Programm entwickeln welches von einem Socket lesen kann.
1. Wenn ich mit fork arbeite, funktioniert es nicht unter Windows. Auch wenn es teilweise unter XP funktioniert, so friert die GUI spätestens bei der Pipe ein.
2. Wenn ich mit threads arbeite, funktioniert nur Tk::configure und auch nur sehr unzuverlässig. Dazu kommt, dass die threads sich von PAR nicht "compilieren" lassen.
3. Auch wenn das groß behauptet wird, so funktioniert fileevent auch nicht mit Sockets. Jetzt wird es langsam eng.
4. Wenn ich mit Tk::repeat arbeite, friert das Programm immer für den bruchteil des Repeat-Intervalls ein. Das sieht sehr unschön aus, da das MainWindow dann teilweise flackert wenn es gerade aktiv ist.
5. POE ist wie ich finde sehr schwer zu lernen besonders weil kaum jemand helfen kann.
Unter Linux komme ich mit den fileevents gut zurecht.
Ich hab mich mittlerweile von dem gedanken verabschiedet ein Programm zu bauen, welches auf beiden Betriebssystem laufen kann.
Das Programm ist unter Linux soweit funktionstüchtig.
Jetzt zu meiner frage: Gibt es sonst noch irgendwelche Windowsspezifischen möglichkeiten um Prozesse in beisein von tk parallel zu behandeln?
Es geht im Grunde nur darum, ein Dateihandle in einer while() zu lesen ohne dass Tk einschläft. Mehr nicht.
Viele haben meine letzten Themen ja auch als nervig empfunden. Aber ich hab echt schwierigkeiten! Tut mir leid!\n\n
<!--EDIT|Froschpopo|1113218825-->
User since
2003-08-08
327
Artikel
BenutzerIn
Ich habe jetzt nicht alles bis ins Detail mitverfolgt, was du in den letzten Tagen / Wochen schon probiert hast, aber hast du es schonmal mit
CPAN: IO::Select versucht? Das kann eigentlich ohne multiple Prozesse nichtblockierend arbeiten.
User since
2003-08-15
2653
Artikel
BenutzerIn
danke für den Tipp ! Aber wie komme ich dann an das Ergebnis von IO::Select ?
Ich hab schonmal daran gedacht, das Sockethandle mit nem Tk::repeat in einem Intervall zu befragen, aber was ist, wenn gerade eine Nachricht ankommt wenn das Timeout eintritt ? Geht die dann nicht verloren ?
User since
2003-08-04
7321
Artikel
ModeratorIn
[quote=Froschpopo,11.04.2005, 22:44]Geht die dann nicht verloren ?[/quote]
nö!
User since
2003-08-15
2653
Artikel
BenutzerIn
ich hab schonmal angefangen...
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
29
30
#!/usr/bin/perl
use warnings;
use strict;
use Tk;
use IO::Socket;
use IO::Select;
my $socket = IO::Socket::INET->new (
PeerAddr => '127.0.0.1',
Type => SOCK_STREAM,
PeerPort => 2005,
Proto=>"tcp"
)
or die "kann Server nicht kontaktieren\n";
my $select = IO::Select->new();
$select->add($socket);
my $main = MainWindow->new();
$main->repeat(50, \&read_sock);
sub read_sock {
my @ready = $select->can_read(0);
print "es liegt eine neue Message vor:\n";
}
MainLoop();
wie komme ich jetzt an die Message ran bzw an das was "IO::Select für mich aufbewahrt hat" ?
User since
2003-08-15
2653
Artikel
BenutzerIn
ich hab nochmal zwei Verständnisfragen:
1. geht das nicht heftigst auf die CPU wenn man nen repeat mit 50 Millisekunden macht ?
2. Wie verhält sich IO::Select, wenn ich z.b. das repeat auf 10 Sekundden setze, innerhalb dieser Zeit jedoch mehrere Nachrichten über die Socket eintreffen?
User since
2003-08-04
7321
Artikel
ModeratorIn
probier es einfach; verdammt!
sorry.
User since
2003-08-15
2653
Artikel
BenutzerIn
hmmm wenn der server am ende eines strings kein \n sendet friert der client ein :D\n\n
<!--EDIT|Froschpopo|1113260371-->