hi,
Ich benutze einen Thread in dem eine Enddlosscheife läuft. Um den Thread zu beenden führe ich detach aus. Jedes mal wenn detach ausgeführt wird, schreibt mir das Thread-Modul ein "A thread exited while ... other threads were still running", auf die Console.
Das ist zwar nicht besonders schlimm, nervt aber fürchterlich.
Wie kann ich also diese Meldung abfangen? Bzw. Wenn es sich dabei um eine Exception handelt (was es vermutlich nicht ist), wie kann man in Perl Exceptions abfangen?
danke
User since
2003-08-04
5246
Artikel
ModeratorIn
warum beendest du ihn mit detach? sobald dann der hauptthread beendet wird, kommt diese warnung. kannst du ihn nicht irgendwie mit join beenden?
User since
2005-05-04
3
Artikel
BenutzerIn
hallo pktm, hallo strat
eval klickt gut, hat zwar jetzt auf die schnelle nicht geklappt, werds mir aber nochmal genauer anschauen.
@strat: der thread lässt sich nicht min join beenden weil eine endlosschleife in ihm läuft. join wartet auf die beendigung des threads.
User since
2003-08-04
5870
Artikel
ModeratorIn
Kannst Du nicht mit last rausspringen?
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;
use strict; use warnings; Link zu meiner Perlseite
User since
2003-08-04
7321
Artikel
ModeratorIn
join: wartet auf den Thread bis er sich beendet hat
detach: beendet den thread doch auch nicht, sondern sorgt dafür, dass sich das Hauptpogramm nicht mehr darum kümmert, oder?
User since
2005-05-04
3
Artikel
BenutzerIn
Du hast recht. Aber ich denke der Thread wird trotzdem unterbrochen wenn das Hauptprogramm abbricht. Ich glaube nicht das der Thread ewig läuft.
Die Schleife laesst sich nicht mit last abbrechen, da es sich um eine Client-Anwendung handelt, die innerhalb der Schleife eine recv funktion ausführt. An der bleibt er stehen und wartet auf eine Nachricht des Servers ohne das ich noch irgendetwas kontrollieren koennte.
eval klappt nicht.
User since
2003-08-04
7321
Artikel
ModeratorIn
[quote=robert,05.05.2005, 12:54]die innerhalb der Schleife eine recv funktion ausführt. An der bleibt er stehen und wartet auf eine Nachricht des Servers ohne das ich noch irgendetwas kontrollieren koennte.[/quote]
doch...
wenn du mit IO::Select arbeitest, kannst du kontrollieren, ob der server dir wirklich was schicken will, oder nicht.
User since
2005-05-04
3
Artikel
BenutzerIn
Das Protokoll das ich benutze ist so spezifiziert das sich festellen lässt wieviele bytes an Daten geschickt werden bis die nachricht vollständig ist. Das wurde eingeführt damit ich auf selects verzichten kann und die Geschwindigkeit der Übertragung nicht durch timeouts gemindert wird.
Letztlich sehe ich aber keine andere Möglichkeit als Select zu benutzen und den timeout auf eine sehr niedrige Zahl zu stellen. Hoffentlich ohne das die Prozessorlast zu hoch wird.
User since
2003-08-04
5246
Artikel
ModeratorIn
vielleicht eine shared variable als semaphor benuetzen und im hauptthread ein join abfeuern, und im "kindthread" diese variable ueberpruefen und dort dann die schleife beenden?