Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]4931[/thread]

Ich seh rot bei multiplen Prozessen für Windows

Leser: 1


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Froschpopo
 2005-04-11 15:25
#43441 #43441
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
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-->
dominicn
 2005-04-11 17:17
#43442 #43442
User since
2003-08-08
327 Artikel
BenutzerIn
[default_avatar]
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.
Froschpopo
 2005-04-12 00:44
#43443 #43443
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
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 ?
esskar
 2005-04-12 00:51
#43444 #43444
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=Froschpopo,11.04.2005, 22:44]Geht die dann nicht verloren ?[/quote]
nö!
Froschpopo
 2005-04-12 01:02
#43445 #43445
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ich hab schonmal angefangen...
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
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" ?
esskar
 2005-04-12 01:15
#43446 #43446
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub read_sock {
if(my @ready = $select->can_read(0)) {
print "es liegt eine neue Message vor:\n";
foreach my $sock (@ready) {
my $line = $sock->getline;
if(defined $line) {
print "Client says: [$line]\n";
} else {
$select->remove($sock);
$sock->close;
}
}
}
}
Froschpopo
 2005-04-12 01:20
#43447 #43447
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
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?
esskar
 2005-04-12 01:57
#43448 #43448
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
probier es einfach; verdammt!
sorry.
Froschpopo
 2005-04-12 02:59
#43449 #43449
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
hmmm wenn der server am ende eines strings kein \n sendet friert der client ein :D\n\n

<!--EDIT|Froschpopo|1113260371-->
esskar
 2005-04-12 04:25
#43450 #43450
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
dann schick ein \n
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2005-04-11 15:25.