Programm aus C++ Code aufrufen [Windows/Linux]

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
exbs
Beiträge: 11
Registriert: Mo Sep 29, 2008 12:51 pm

Programm aus C++ Code aufrufen [Windows/Linux]

Beitrag von exbs » Mi Apr 13, 2011 1:10 pm

Hallo,

ich suche nach einer guten Lösung, um ein Programm aus meinem laufendem Programm aufzurufen. Dabei soll folgendes möglich sein:
1) Ich muss wissen, wann der Prozess beendet wird. (Dabei spielt es keine Rolle warum, sprich Fehler und der Gleichen)
2) Es sollte möglich sein, diesen Prozess so zu starten, dass ich mein Programm weiterhin benutzen kann. (sollte mit Threads gehen, bin allerdings in das Thema noch nicht eingelesen.)
3) Die Lösung sollte sowohl auf Linux, als auch auf Windows die selben Ergebnisse produzieren.

Was muss die Lösung nicht können:
1) Ich brauche keine Daten aus dem anderen Programm, es sollen also keine Daten ausgetauscht bzw. auf einen gemeinsamen Speicher zugegriffen werden.

Beim Suchen durchs Netz bin ich auf Sachen wie: system(), pipe´s und spawnl gestoßen. Das Einzige was ich davon kenne ist system().

Hat jemand damit Erfahrung ? Oder einen Tipp, was unter den gegebenen Umständen das sinnvollste ist ?

MfG exbs

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Programm aus C++ Code aufrufen [Windows/Linux]

Beitrag von Xin » Mi Apr 13, 2011 1:35 pm

Moin exbs.

am 29. Sep 2008 registriert und schon Dein erster Beitrag. :-D
Ich hatte Dich nicht gelöscht, weil Du ja noch einer von der alten Garde bist. Die anderen Leute mit 0 Beiträgen lösche ich normalerweise nach drei Monaten wieder. ^^
exbs hat geschrieben:ich suche nach einer guten Lösung, um ein Programm aus meinem laufendem Programm aufzurufen. Dabei soll folgendes möglich sein:
1) Ich muss wissen, wann der Prozess beendet wird. (Dabei spielt es keine Rolle warum, sprich Fehler und der Gleichen)
system() aus der Standard-Lib
exbs hat geschrieben:2) Es sollte möglich sein, diesen Prozess so zu starten, dass ich mein Programm weiterhin benutzen kann. (sollte mit Threads gehen, bin allerdings in das Thema noch nicht eingelesen.)
Unter Linux/Posix: fork() und waitpid().
Windows wird vermutlich anders gehen.
exbs hat geschrieben:3) Die Lösung sollte sowohl auf Linux, als auch auf Windows die selben Ergebnisse produzieren.
Da müsste man sich wohl hinsetzen und eine plattformabhängige Implementierung einer Klasse machen, was die Threads angeht. Unter Windows bin ich da aber gerade auch nicht auf dem Laufenden.

Daran hätte ich aber auch Interesse.
exbs hat geschrieben:Beim Suchen durchs Netz bin ich auf Sachen wie: system(), pipe´s und spawnl gestoßen. Das Einzige was ich davon kenne ist system().

Hat jemand damit Erfahrung ? Oder einen Tipp, was unter den gegebenen Umständen das sinnvollste ist ?
system ist ein vergleichsweise einfacher Befehl: es wird das Kommando aufgerufen, dass man dort übergibt.
Pipes brauchst Du, wenn Du mit dem Befehl über Standardein- und -ausgabe kommunizieren möchtest. Unter Windows gibt es da eine popen()-Funktion, mit der man ein Dateihandle für einen Prozess erhält - ob es die unter Linux gibt, weiß ich jetzt nicht.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Programm aus C++ Code aufrufen [Windows/Linux]

Beitrag von canlot » Mi Apr 13, 2011 2:21 pm

Unter Windows vielleicht noch:
ShellExecute
CreateProcess
TerminateProcess
Unwissenheit ist ein Segen

exbs
Beiträge: 11
Registriert: Mo Sep 29, 2008 12:51 pm

Re: Programm aus C++ Code aufrufen [Windows/Linux]

Beitrag von exbs » Mi Apr 13, 2011 2:25 pm

Cool, dass du dich noch erinnerst. Ich bin eine eine Weile mit Java unterwegs gewesen. Jetzt komme ich langsam wieder in C++ rein und da gibt es noch viel zu tun.

Ich habe etwas rumprobiert und gelesen und festgestellt, dass ich eigentlich versucht habe zwei Probleme auf einmal zu lösen (Habe erst einmal die Begriffe Prozess und Thread etwas schwamming vermischt):

1) möchte ich einen Prozess auf meinem System starten. Dabei handelt es sich um ein Programm, welches nicht von mir ist. Ich schreibe quasi eine Oberfläche, in der Konfigurationsdatein bearbeitet werden und damit das ganze komfortabler ist, kann dann direkt das entsprechende Programm gestartet werden. Falls das jetzt etwas verwirrend ist, dann kann ich das verstehen ;).

Habe gerade etwas (sehr kurz) mit popen() experimentiert und das scheint für meine Zwecke zu reichen (Habe es auf Linux getestet). Es startet das Programm und fertig. Einen Exitcode kann ich auch abfragen, damit lässt sich ja feststellen, ob das Programm beendet wurde oder nicht.

2) Die Sache mit den Threads werde ich wohl mit wxWidgets erledigen. Da ich auch die Oberfläche darin schreibe und es Plattforunabhängig ist, nutze ich gleich das. Allerdings ist das Thema Threads noch recht neu für mich und ich muss mir erst ein gutes Konzept überlegen. Im Prinzip soll halt nur das Programm gestartet sein und die Oberfläche benutzbar bleiben. Das bleibt sie zwar auch wenn ich popen() "allein" nutze, allerdings muss ich ja iwie darauf warten, dass das Programm fertig ist. Deswegen sollte diese Sache in einen Thread, damit ich auf das Ende warten kann. Was sagst du (ihr) ? Ist der Lösungsansatz so sinnvoll ?

MfG exbs

[EDIT] leider war ich etwas voreilig ... einen Exitcode bekomme ich nur, wenn ich das Programm mit pclose() beende ... Also steht die Frage im Raum, wie ich überhaupt abfangen kann, dass das Programm beendet wurde ?


Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Programm aus C++ Code aufrufen [Windows/Linux]

Beitrag von Bebu » Mi Apr 13, 2011 5:39 pm

Du kannst dir auch nochmal Boost::Thread ansehen, für den Thread. Das mit dem Exitcode ist wieder eine andere Sache.
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

exbs
Beiträge: 11
Registriert: Mo Sep 29, 2008 12:51 pm

Re: Programm aus C++ Code aufrufen [Windows/Linux]

Beitrag von exbs » Di Mai 31, 2011 3:33 pm

Hallo Leute,

also erstmal muss ich mich entschuldigend, dass ich das Thema so lange habe brach liegen lassen. Bei der Aufgabe die ich zu lösen haben, bin ich bevor ich an den oben beschriebenen Problem angelangt bin, erstmal auf viele andere Hürden gestoßen. Trotzdem schreibe ich euch mal wie ich es letztlich gelöst habe.

Mit der Bibliothek wxWidgets ist es möglich eben diese Funktionalität recht schön zu erreichen. Für alle die es interessiert, hier mal ein http://docs.wxwidgets.org/2.9.1/classwx_process.html. Wenn jemand etwas Quelltext sehen will, einfach bescheid sagen.

Im Prinzip ist genau das möglich was ich wollte. Prozesse starten und Nachricht bekommen, wenn dieser beendet wurde.

Lg

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Programm aus C++ Code aufrufen [Windows/Linux]

Beitrag von Xin » Di Mai 31, 2011 3:37 pm

Besten Dank für einen gelösten Thread.

Was schreibst Du überhaupt? ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

exbs
Beiträge: 11
Registriert: Mo Sep 29, 2008 12:51 pm

Re: Programm aus C++ Code aufrufen [Windows/Linux]

Beitrag von exbs » Di Jun 07, 2011 12:24 pm

Ich schreibe eine generische Oberfläche für Konsolenprogramme. Das ist jetzt sehr zusammen gekürzt, aber im Prinzip schon die Aufgabe. Das aufwendigste ist die Einarbeitung in die Oberflächenbibliothek. Das war auch der Grund, warum ich den Thread so lange nicht gepflegt habe.

Die Oberfläche soll konfigurierbar sein, damit der Anwender sie an seine Bedürfnisse anpassen kann. Also zum Bsp. Parametermenus erzeugen, Konfigurationsdatei-Editor, variable Buttonleiste usw. usw ...

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Programm aus C++ Code aufrufen [Windows/Linux]

Beitrag von Xin » Di Jun 07, 2011 12:38 pm

Interessantes Projekt. Halt uns mal auf dem Laufenden :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten