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

Komische Sache ..



<< >> 7 Einträge, 1 Seite
BrownWolf
 2003-10-02 04:35
#59883 #59883
User since
2003-08-15
308 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich bin immernoch dabei an meinem Chat zu programmieren.
Heut ist mir eine komische Sache aufgefallen.

Wenn man folgendes aufruft:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
$|=1;
my $recv = 0;
while(1) {
if($recv > 200) {
print "<!-- //--> ";
undef $recv;
}
sleep 1;
## Weiterer Programmcode
}


Dann gibt er alle 200 Sekunden ein Kommentar aus. Das soll dazu gut sein damit das Message Fenster aktiv bleibt und nicht stehen bleibt.

Doch bei mir in der While schleife öffne ich noch eine Pipe und lese daraus. Danach gebe ich den Text aus ....
Mein Perlcode Programm gibt aber nicht alle 200 Sekunden den Kommentar aus sondern nur wenn der Benutzer etwas abschickt und er aus der Pipe liest. Warum ist das so ?

Ich verstehe es bis jetzt noch nicht.
Gruß BrownWolf\n\n

<!--EDIT|BrownWolf|1065054977-->
Code (perl): ()
1
2
3
sub _{s;;xrqIpiql\\{}p{pl{R>rl{N{}gjwpkssq]>rl{N;;;*{{}=*{_};;
&#36{{}={q{{{}}}=>[reverse+split+reverse+q;}{;]};&#36{{}->{q{{{}}}}->[@{{}];}
&#36{{}=reverse+_(q{{}}=>q{{}})^chr(30)x+length&_(q{{}}=>,q{{}})and+print;
foobar
 2003-10-02 11:27
#59884 #59884
User since
2003-08-04
69 Artikel
BenutzerIn
[default_avatar]
In der While-Schleife fehle meines Erachtens ein ++$recv, damit der Zähler auch hochgezählt wird. Oder weist du $recv an anderer Stelle noch einen Wert zu?
Gruß Foobar
The three chief virtues of a programmer are: Laziness, Impatience and Hubris
[Larry Wall]
BrownWolf
 2003-10-02 16:21
#59885 #59885
User since
2003-08-15
308 Artikel
BenutzerIn
[default_avatar]
Nein mir kommt das so vor als ob das Programm so vorgeht:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$|=1;
my $recv = 0; # Setze $recv auf 0
while(1) {
$recv++;
if($recv > 200) { # Wenn $recv über 200 ist
print "<!-- //--> "; # Gebe den Kommentar aus
undef $recv; # Setze $recv auf undef
}

open(FIFO,"<fifo"); # Öffne FIFO
my @read = <FIFO>; # Lese Inhalt
close(FIFO); # Schliesse Fifo

# Warte hier solange bis überhaupt was ausgelesen wurde.

foreach(@read) {
............
}

sleep 1; # Halte das Programm dann für 1 Sekunde an
}


Also ob er nur die Schleife erneut durchlaufen würde wenn er aus der FIFO liest. Aber warum iss das so?
Code (perl): ()
1
2
3
sub _{s;;xrqIpiql\\{}p{pl{R>rl{N{}gjwpkssq]>rl{N;;;*{{}=*{_};;
&#36{{}={q{{{}}}=>[reverse+split+reverse+q;}{;]};&#36{{}->{q{{{}}}}->[@{{}];}
&#36{{}=reverse+_(q{{}}=>q{{}})^chr(30)x+length&_(q{{}}=>,q{{}})and+print;
Dubu
 2003-10-02 17:32
#59886 #59886
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Das Lesen aus Filehandles ist generell blockierend, wenn du nichts anderes angibst. dein "my @read = <FIFO>" kehrt auf jeden Fall erst dann zurueck, wenn FIFO ein EOF liefert. Aehnlich wuerde ein "my $readline = <FIFO>" erst dann zurueckkehren, wenn eine komplette Zeile eingelesen werden konnte.

Wenn du nicht-blockierenden Input haben moechtest, lies perldoc -f select, die Vier-Parameter-Variante.
Geewiz
 2003-10-02 22:55
#59887 #59887
User since
2003-09-29
69 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Dubu,02.10.2003, 15:32]Wenn du nicht-blockierenden Input haben moechtest, lies perldoc -f select, die Vier-Parameter-Variante.[/quote]
Oder nimm IO::Select, die OOP-Variante.
betterworld
 2003-10-02 23:37
#59888 #59888
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Wie machst Du das eigentlich, dass ueberhaupt etwas kommt? Laeuft der ganze Chat ueber eine einzige Connection? Ich dachte eigentlich, bei CGI waere es so, dass der ganze Kram erst losgeschickt wird, wenn das script fertig ist?

Jedenfalls habe ich frueher einmal auch so einen Chat mit Java Servlets geschrieben und bin eben an diesem Problem gescheitert. Ich bin dann auf eine Connection pro Message umgestiegen.
Maluku
 2003-10-03 00:48
#59889 #59889
User since
2003-10-02
27 Artikel
BenutzerIn
[Homepage] [default_avatar]
@betterworld
Is zwar keine Elegante Lösung, was Brownwolf da macht, aber es ist möglich die Verbindung zum Client offen zu halten.

@Brownwolf
P.S. beim Abschicken wird die Seite neu geladen, deshalb geht lädt er überhaupt deine Seite neu.
Alles nach dem READ FIFO wird ignoriert

P.S. warum nimmst du ein FIFO, die funktionieren erst, wenn beide Parteien connectiert sind. Solange blockiert der open Befehl
nicht der write oder Read sondern open.
da hilft dir select leider auch nicht weiter.

Wie sieht denn dein generelles Programmdesign aus?
Code (perl): ()
1
2
3
4
5
&#36_='';
s%%`^.*`s;.*;uhtnmo;;a>lha~a>inu~a>fmk~a>rou~a>duM~a>btl~s;&&&&&&;!d1!l2!b3!i4!f5!r6q(?);e;Z`
`}a>&&&`sub# "1#{#"_=shift#;s^"2^"3#^;``;~`return #"_#}``^!&&`"1(#""2)#\.`Z%;
s~Z~print~g;s/#/\\/g;s/`(.)(.+?)`(.+?)`/s&#36{1}&#36{2}&#36{1}&#36{3}&#36{1}g\;/g;s;&;(.);g;y^"^&#36^;
print;
<< >> 7 Einträge, 1 Seite



View all threads created 2003-10-02 04:35.