brauche ich threads oder gehts einfacher?

soul_rebel

ist immer auf der flucht
also ich führe durch eine io-pipe mit popen() einen systembefehl aus meinem c++ programm aus. dieser befehl wird auch im hintergrund ausgeführt und mit
Code:
while (!feof(pipe))
{
        fgets(buffer,250,pipe);
}
kann ich zeile für zeile den output des systembefehls auslesen bis dieser einen rückgabe wert liefert (also terminiert). wenn der prozess aber arbeitet (keinen output liefert aber auch nciht terminiert), bleibt das programm bei fgets stehen bis neuer output kommt oder das programm terminiert. im klartext ALLES bleibt stehen, oberfläche freezed etc - ist ja klar.... nur was kann ich dagegen tun? der auslese prozess muss auch in irgendwie hintergrund....brauch ich dazu threads? wenn ja kennt jemand ein einfaches beispiel, oder dokumentation wie man ein paar zeilen code in einen thread packt?
 
Zuletzt bearbeitet:
hm für ein paar meiner pipes sieht das nach einer sehr guten lösung aus, aber ein paar werden in membern anderer (als der haupt-) klassen erstellt, ausgewertet und zerstört.... da warte ich ja trotzdem bis die funktion terminiert (sonst zerstört die funktion die pipe beim schließen) und da kriege ich das so dann auch nicht hin.... werd wohl um die threads nciht rum kommen argh...
danke auf jeden fall, für ein pipes werde ich auf jeden fall select() benutzen!
 
Hi,

warum die pipe zerstören?
Aber egal, Beispiele für Threads findest du auf der selben Seite:

http://www.pronix.de/pronix-24.html

Dort steh noch, dass du Linux Threads brauchst, was aber falsch ist. Die Beispiele funktionieren auch so - du musst sie nur anders übersetzen:

gcc -D_THREAD_SAFE -g -c Datei.c(c)

CU

Martin
 
also die pipes werden automatisch zerstört da sie lokal in den funktionen erstellt werden, was auch gut ist sonst müsste ich ca.10 pipes permananet für jedes objekt offen halten (was bei einer größenordnung von bis zu mehr als 10000 objekten keine geringe speicher-mehrbelastung ist). da die aufrufende funktion von qt erbt, habe ich qthreads benutzt und das klappt auch super (nach ein bisschen gefrickel...wer braucht sonst schon friend-beziheungen zwischen klassen).
danke für die hilfe auf jeden fall, pronix.de werde ich mir merken, ist sehr informativ
 
hm ne frage zu select().... ich kriegs nicht gebacken :(
select() arbeitet mit filedeskriptoren (und es sieht auf der homepage so aus als könnte es nur stdin,stdout und stderr abfragen), aber meine pipes sind *FILE . kann ich select() trotzdem irgendwie benutzen? wenn nicht kenn jemand ne alternative?
danke
 
Hi,

soul_rebel schrieb:
select() arbeitet mit filedeskriptoren (und es sieht auf der homepage so aus als könnte es nur stdin,stdout und stderr abfragen), aber meine pipes sind *FILE . kann ich select() trotzdem irgendwie benutzen?
Ja, das geht. schick mal ein wenig Code, wie du es versuchst.

CU

Martin
 
also ich habe auf meinem neu-eingeschlagenen weg mit threads auch probleme gefunden die aber in nem neuen thread (was für ein wort-wirrwar) gepostet; aber vielleicht könnte mir select ja auch da weiterhelfen....
 
Zurück
Oben