QThread + execv

Alles rund um die Programmierung mit Qt
Antworten
andy72
Beiträge: 39
Registriert: 5. April 2007 07:51

QThread + execv

Beitrag von andy72 »

Hi,

ich habe eine grundsätzliche Frage zu QThread bzw execv(const char*, const char*):

Ich möchte gerne einProgramm aus meiner Anwendung heraus starten, ohne, dass meine Anwendung dabei blockiert wird oder sonst was.
Mein Lösungsansatz ist wie folgt:

Ich habe eine Klasse von QThread abgeleitet, in der die Funktion "run()" implementiert wird, und darin die funktion execv() ausführt.

Aufgerufen wird das ganze von einem Button in einem Widget, der bei Mouseclick den Thread anstösst (mit start() ).

Nun mein Problem:
Das ganze funktioniert soweit, dass meine Anwendung normal reagiert, wenn der Thread gestartet ist, jedoch wenn ich die Anwendung aus dem Thread 2x gestartet habe, beendet sich meine (Haupt-)Anwendung selbst,
die in einem X-Server läuft und Probehalber mit "exec anwendung" in ~/.xinitrc gestartet wurde.

Liegt das Problem in xinitrc, sollte ich keinen Thread verwenden oder habe ich einenkompletten Denkfehler ??? :D

Bin für jede Hilfe dankbar :)
LG
Andy
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Btw. was kann execv, was QProcess nicht kann? Außerdem warum sollte deine Anwendung blockiert werden, wenn du eine andere startest?
andy72
Beiträge: 39
Registriert: 5. April 2007 07:51

Beitrag von andy72 »

Nun, egal, was ich bisher probiert habe - meine Anwendung beendet sich nach beenden des neuen Prozesses ständig selbst, und ich finde den Fehler nicht. Habe es mit execv, execl, execp und auch mit QProcess probiert, jedoch habe ich überall den selben Effekt
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Beendet sich deine Anwendung regulär oder wird sie durch einen Fehler beendet?
andy72
Beiträge: 39
Registriert: 5. April 2007 07:51

Beitrag von andy72 »

Meine Anwendung beendet sich selbst ohne Fehler durch Qt, ohne Fehler des X-Servers (Version Xorg 7.1.1) und ohne coredump.

Ich vermute schon fast, dass ich die ~/.xinitrc falsch habe, denn die main.cpp ist auch ganz normal aufgebaut.

Meine Anwendung startet mit

Code: Alles auswählen

#!/bin/sh

export PATH=$PATH:$HOME/bin

exec myprog
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wenn sich deine Anwedung regulär beendet, dann würde ich mal nachschaun wer deiner Event-Loop mitteilt, daß sie sich zu beenden hat. exec & Co machen das nämlich nicht...
andy72
Beiträge: 39
Registriert: 5. April 2007 07:51

Beitrag von andy72 »

Hm,habe den Fehler gefunden ... QProcess brachte doch einen Fehler:
"Process Destroyed, already running".

Habe herausgefunden, dass man das QProcess-Object mit "new" erstellen muss, sonst nimmt er den Parent-Process, der natürlich schon läuft :D

...warum aber execv & co meine Anwendung killt, bleibt trotzdem ein Geheimnis, aber egal, mit QProcess geht es jetzt *g*

Danke für die Hilfe :)

*Thema hiermit beendet*
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Wir beschreiben nun eine ganze Klasse von ähnlichen Systemaufrufen, die exec-Familie. Sie dienen dazu, ein auf einem File stehendes Programm zu laden und auszuführen. Das aufrufende Programm beendet seinen Ablauf mit dem exec. Dabei entsteht kein neuer Prozeß. Vielmehr wird der einen exec-Call ausführende Prozeß durch den durch die Ausführung des angegebenen Programmes entstehenden Prozeß überlagert. Die Prozeß-Id bleibt dieselbe.
Das verhalten ist korrekt. Exec? ueberlagert deinen Prozess. zu deinem prozess gehoeren auch alle deine threads.

Wolltest du das verhindern, und das Programm parallel starten, muesstest du zuerst nen neuen Prozess erzeugen (fork/CreateProcess) und den neuen Prozess mit dem exec uerberladen.

QProcess macht intern auch genau dies ....
Gibt aber unter linux system calls die Dir fork und exec auch gleich tun ...

ciao ...
andy72
Beiträge: 39
Registriert: 5. April 2007 07:51

Beitrag von andy72 »

Ja, habe das mit der exec-familie wohl falsch verstanden. Meine Anwendung erlaubt nun,einen Prozess wie gewünscht mit QProcess zu starten, und ichkann mittels weiterer Mechanismen auch auf die gestartete Anwendung einfluss nehmen :)

LG
Andy
Antworten