Seite 1 von 1

Probleme bei fork()

Verfasst: 25. Juli 2006 15:54
von stockfisch
Hallo Mädls und Jungs,

habe folgendes Problem: MainWidget erzeugt Objekt einer Klasse, für die eine Methode aufgerufen wird, wo folgendes passiert:

Vater erzeugt zwei Kinder, die über eine Schnittstelle Daten empfangen. Die Kinder kommunizieren über Shared Memory mit dem Vater, der Vater soll dann wiederrum die empfangenen Daten in den GUI schreiben.

also ungefähr so: im MainWidget wird Funktion mkproc(pointer auf MainWidget) aufgerufen.

Code: Alles auswählen

function mkproc(MainWidget * ){
     allgemeiner Code (beschreiben vom Gui funktioniert noch)

     if ((pid=fork() > 0){
          Vater erzeugen und shm zur Verfügung stellen
          Vater 'merkt' auch, wenn Daten von Kindern gekommen sind und 
          soll GUI befüllen -> geht aber nicht
     } else if { (pid=fork() > 0) {
          Kind 1 (empfängt Daten und schreibt in shm
     } else if { (pid=fork() > 0) {
          Kind 2 (empfängt Daten und schreibt in shm
     }
} // Ende Methode
Anmerkung: Leider kann ich nur mittels fork() Prozesse erzeugen und nicht Threads; Library zum Empfangen der Daten ist nicht Thread-Safe :roll: ..

Hat jemand die rettende Idee? :?

<Edit> verwende QT 3.3 </Edit>

Verfasst: 25. Juli 2006 16:21
von Christian81
Ich glaube fork() ist keine gute Idee da Du damit ggf. die internen Strukturen von Qt durcheinander bringst und er (vielleicht) nicht mehr so recht weiss welcher Thread/Process der GUI-Thread ist (nur dieser darf / kann grpahische Ausgaben machen).
Mach fork mal in der main() - Methode bevor QApplication instanziiert wird.

Verfasst: 25. Juli 2006 17:44
von stockfisch
HI Christian,

hmm naja, um das fork() komm ich leider nicht herum; das Problem, wenn ich in der main-Methode (also vor der Instantierung der QApplication) das fork mache kann ich keinen Pointer auf das MainWidget übergeben; da lebt es ja noch nicht und somit kann der Vater auch dieses nicht befüllen .. oder denk ich da zu kompliziert scho wieder?

Verfasst: 26. Juli 2006 07:43
von Christian81
Probiere einfach mal den fork() so früh wie möglich zu machen, evtl. auch nur zu Testzwecken.
Kannst Du die beiden Worker-Prozesse evtl. als eigenständige executables machen damit Du sie mittels QProcess aufrufen kannst?