Events empfangen!
-
Ich brauche ein bißchen Hilfe bei der C++ Programmierung. Ich
bin nähmlich Anfängerin.Ich habe zwei Programme die miteiander kommuniezieren sollen.
Das erste Programme ist eine Art Wächter der die ganze Zeit aktive sein soll und lauscht ob sich etwas beim zweiten Programm verändert hat. Der Wächter soll also Events vom zweiten Programm abfangen.
Der Wächter greift auf das zweite Programm über eine Schnittstelle.Was ich erreichen will ist dass, wenn ich beim diesen zweiten Programm ein bestimmten Knopf drücke, dass der Wächter dieses Ereigniss irgendwie empfängt.
Die einzige Möglichkeit die ich bisher aber habe, ist den Wächter, nach dem Drüpcken des Knopfes, über Pfadeingabe zu starten. Das ist aber nicht ganz was ich will, denn eine Intanz der Wächter soll schon voher aktiv sein. Sonst würde ich jedes Mal dass ich ein Wert ändere und den Knopf drücke eine neue Instanz des Wächters erzeugen.
Hat irgendeiner eine Idee wie man generell solche Probleme löst, Thread od. sonst was. Mein Schnittstelle ist nich sehr flexible, die erlaubt nur Initialisierung, Abfrage und Zuweisung von neuen Werte oder Infos.
Vielen Dank in voraus.
-
Hem, da gibt es mehrere Möglichkeiten. Die einfachste und mit Standard C++ zu realisieren, sind Functionpointer.
Du mußt dazu deiner Klasse die die Events abfeuern soll, den Funktionspointer (den sie aufrufen soll), bekannt geben. Wenns mehrere Event-Empfänger sind, legst du die in einem std::vector ab.Jedesmal wenn ein Event gefeurt werden soll, wird die Funktion aufgerufen und kannst auch Parameter übergeben.
WIe Functionpointer funktionieren, wurde hier im Forum bestimmt schon abgehandelt (Suchfunktion!) oder du schaust mal in ein vernünftiges C++-Buch rein.
Functionpointer funktionieren aber nur innerhalb eines Programms.Ein weitere Möglichkeit wäre aber auch, das ganze über Sockets und TCP/IP zu machen. Aber da brauchst du weitere Libs für, in der STL sind diese nicht enthalten. Dann kannst du über TCP/IP kommunizieren, selbst wenn es zwei verschiedene Programme sind und sogar (wenn es sein muß) auf verschiedenen Rechnern. Mit den entsprechenden Libs auch schnell realisiert.
-
2 verschiedene Programme und Funktionspointer ^^

@Jenny
Welches OS verwendest Du denn ?
-
Ach, was ich vergessen hatte zu erwähnen ist dass ich das zweite Programm gar nicht modifizieren kann, ich verfüge nicht über den Quellcode, est ist nur eine exe Datei. Ich kann nur über eine DLL Schnittstelle darauf zugreifen. Also weiss ich in Prinzip gar nicht ob das, was ich mit dem Events erreichen will überhaupt realisierbar ist.
Die Sache ist nur, wenn ich eben auf diesem Knopf drücke, wird eine zweite Instanz vom Wächter erzeugt obwohl eine schon aktiv ist. Kommunizieren tut das Programm aber mit der erste Instanz des Wächters, komischerweise. Deswegen dachte ich, irgendwie schafft das Programm zu merken wenn sich etwas verändert, ich weiss bloß nicht wie.
Das sind die Parameter mit dem ich das Programm calc, in der main(...)-Methode meine Wächter-Klasse initialisiere, mit Hilfe des Konstruktors von calc:
const DWORD dwFlags = MANUALINIT
LPCTSTR Name const = "calc"
UINT uSharedMemorySize = NULL
const DWORD dwTimeout = INFINITE
const TimeoutHookProc timeoutHookProc = NULL
void *const pVoid = NULLdann rufe ich Init(); Hier bleibt das Programm erst stehen, ich weiss nicht wieso.
dannach rufe ich diverse Methode der Schnittstelle auf, bis zum den Punkt kommt das Programm aber bei der erste Instanz nicht, da es bei Init stehen bleibt.
Wenn ich jetzt aber in calc mit Hilfe des Knopfes eine zweite Instanz vom Wächter starte, wird die Methode Init in der erste Instanz (also im ersten DOS Fenster) endlich zu Ende ausgeführt und die weitere Schnittstellen-Methoden aufgerufen.
Blöderweise habe ich aber jetzt das DOS-Fenster der zweite Schnittstelle, die ich nicht brauche und die ihrerseite auch bei Init stehen bleibt.Ich weiss, es ist ein bißchen verwirrend, aber leider komme ich überhaupt nicht weiter. Ich habe früher nur Java programmiert, und verstehe noch nicht ganz, diese ganze Abläufe bei C++. Wäre sehr dankbar für jede Hilfe.
Was war eigentlich mit OS gemeint?
-
Betriebssystem (Operating System) war damit gemeint.
-
Standard C++ kümmert sich nicht um den Austausch von Daten zwischen mehreren Prozessen. Da du offensichtlich Windows verwendest, passt deine Frage auch besser ins WinAPI Forum.
-
JennyFromTheBlock schrieb:
Ich habe zwei Programme die miteiander kommuniezieren sollen.
Das erste Programme ist eine Art Wächter der die ganze Zeit aktive sein soll und lauscht ob sich etwas beim zweiten Programm verändert hat. Der Wächter soll also Events vom zweiten Programm abfangen.das problem ist nicht gerade ein c++-problem. eher eines deines betriebssystems. interprozesskommuniekation geht so allein in c++ nicht richtig. außer mit kommunikation über dateien oder programmaufrufe. sag also, welches bs du hast und der thread wird dahingeschoben. dann können wir ganz konkret werden.
da du gerade das wort Event verwendet hast. ja, bei mancen BSen gibt es events. oder semaphoren, pipes, shared memory und noch ähnliche dinger.
bei deienem problem müßte ich mehr wissen.
ist das event sowas wie "klappe ist auf" oder "Klappe ist zu"? dann ist ein event ideal. also wenn nur ein status bekannt sein muß.
sind die statusänderunen selbst wichtig, dann sind semaphoren angesagt. die zählen mit. man kann z.b. 5 statusänderungen schicken ubd der empfänger arbeitet dann auch 5 ab.
sind daten mitzuschicken, könnten pipes gut sein.
und statt pipes kann man natürlich auch über tcp-ip miteinander reden.
beispielpseudocode für semaphoren:
int sendermain() { Semaphore sema("eindeutigername"); sema.signal(); } int empfängermain() { Semaphore sema("eindeutigername"); for(;;) { sema.wait(); cout<<"der sender hat mir bescheid gesagt"<<endl; } }
-
Ich verwende MS Windows 2000 Professional.
-
Geht es dir darum Nachrichten an die andere Anwendung zu schicken, oder was genau hast du vor
Hast du Konsolenanwendungen?
-
Nun ich möchte über die Schnittstelle Werte auslesen, die brauche ich für eine Konsistenzprüfung, und dann will ich einfach 0 zurückgeben falls alles in Ordnung ist. Ja z.Z ist es eine Konsoleanwendung.
-
Allerdings will ich die Werte erst auslesen nachdem, ein bestimter Knopf gedrückt worden ist. Deswegen die Frage mit den events.
-