User since
2003-08-15
2653
Artikel
BenutzerIn
ich hab nen Tk Script und eine Schleife die eine Socketverbindung beobachtet.
Mein ursprünglicher Plan war, die Kommunikation zwischen den Sockets in einen fork auszulagern.
Das funktioniert auch prima.
Jedoch scheitere ich jedesmal an der schleife welche die pipe() zwischen Vater und Sohn überwacht.
Das Problem ist, dass Tk einfriert solange die pipe()-Schleife WAHR ergibt. Einige kennen ja schon mein Problem.
Die Frage:
Der einzigste Ausweg der mir bisher eingefallen ist mit dem Tk-eigenen repeat() in einem Intervall die Socket zu beobachten.
Aber ist das nicht sehr Performancebelastend wenn ich <READ> ca. alle 300 ms. einlese?
Das Thema POE behandel ich bereits parallel zu diesem. Es gibt also keinen Grund mich wiedermal auf POE aufmerksam zu machen. In diesem Thema gehts also nur um repeat
User since
2003-08-04
7321
Artikel
ModeratorIn
1. was meinst du mit <READ> einlesen?
2. wie, wo und wann machst du das mit den pipes?
(sorry, hab nicht alle deine Threads verfolgt (ist ja auch unmöglich ;) ), deshalb weiß ich nicht, ob du die Fragen schon an einer anderen Stelle beantwortet hast!)
User since
2003-08-15
2653
Artikel
BenutzerIn
mit pipe(READ, WRITE) kann ich ja nachrichten zwischen Vater und Sohn austauschen.
Mal zu meinem Problem:
Ich hab nen Vater der lässt seinen Sohn arbeiten. Der Sohn soll aber Statusmeldungen zurück an den Vater geben.
Da der Vater in einer Schleife auf Antworten vom Sohn wartet, friert die Tk-Oberfläche ein.
Also das Thema fork scheint wirklich nicht zu funktionieren.
Wie sieht das denn mit Threads aus ?
User since
2003-08-04
2536
Artikel
ModeratorIn
schau dir mal
IO::Select an, damit kannst du non-blocking checken, ob innerhalb einer bestimmten zeit daten auf einem handle zum lesen bereitstehen, d.h. er wartet maximal solange, wie du definierst und nicht endlos.
User since
2003-08-15
2653
Artikel
BenutzerIn
aber ich weiss ja nicht wann das Kind fertig ist.
Ein anderes Beispiel:
Stell dir vor das Kind lauscht an einem socket und gibt bestimmte Ereignisse an den vater zurück. Der Vater müsste dann auch ständig in bereitschaft sein.
Die Lösung:
Das Kind müsste irgendwie selbstständig ne Funktion im Vaterprozess aufrufen können ohne dass der Vaterprozess in einer Schleife lauschen muss.
User since
2003-08-15
2653
Artikel
BenutzerIn
optimal wäre sowas hier:
unless ( $pid = fork()) {
sub_bei_den_eltern();
CORE::exit;
}
sub sub_bei_den_eltern {
# hier sind wir wieder bei den eltern
}\n\n
<!--EDIT|Froschpopo|1112835415-->
User since
2003-08-04
7321
Artikel
ModeratorIn
was macht dein vater denn? ich nehme an, es ist dein server, oder? zeig mir mal deinen fork-teil sowie die Stelle, an der du pipe benutzt. Am besten zusammen hängend!
User since
2003-08-15
2653
Artikel
BenutzerIn
[quote=esskar,07.04.2005, 03:12]was macht dein vater denn? ich nehme an, es ist dein server, oder? zeig mir mal deinen fork-teil sowie die Stelle, an der du pipe benutzt. Am besten zusammen hängend![/quote]
der vater ist ein Tk-Programm ! Ne schleife führt in jedem fall zum einfrieren der GUI ! Ohne Schleife kann ich keine Pipe machen... :-(
User since
2003-08-04
7321
Artikel
ModeratorIn
doch kannst du!
wo und wofür benutzt du denn fork?\n\n
<!--EDIT|esskar|1112836673-->
User since
2003-08-15
2653
Artikel
BenutzerIn