2 Exe gleichzeitig


  • Mod

    Dann hast Du ein COM Problem... Du erzeugst ein COM Objekt und der Aufruf in diesem Object ist natürlich synchron. D.h. er returniert erst, wenn er eben fertig ist.

    Du könntest in der Theorie, das Objekt in einem anderen Thread erzeugen, nur hast Du dann einmassives STA Problem und die Frage ist, wie weit wird eben noch mit dem Objekt gearbeitet... Was macht eben HookEvent?

    Bevor Du mit einem zweiten Thread anfängst solltest Du Dir erstmal über die Implikation "Hier ist ein COM Objekt" klar werden.



  • Ich kann die EXE nicht als Thread umbauen.
    Der Grund für ein COM Objekt ist die, da die 2 Exe auf eine DB Zugreift.


  • Mod

    simcon schrieb:

    Ich kann die EXE nicht als Thread umbauen.
    Der Grund für ein COM Objekt ist die, da die 2 Exe auf eine DB Zugreift.

    Du hast es nicht verstanden.
    1. Deine Applikation blockiert (zwangsläufig) so lange wie Du in der zweiten EXE eine COM Funktion ausführst.
    2. Du sollst die zweite EXE nicht als Thread umbauen, sondern den ZTugriff auf dieses COM Objekt der EXE in einen zweiten Thread auslagern. Aber Achtung! Das ist nicht ohne bei einem STA!
    3. Der Zugriff auf eine weitere DB ist keine Begründung für eine EXE! Man kann so etwas sicherlich weitaus besser lösen, als über einen Outofprocess Server, sofern man von beiden Programmen natürlich die Sourcen hat.



  • Ich glaub, dass ist ein grösseres Problem.
    Das geht nicht mal so auf die Schnelle.....
    Ist es überhaupt möglich? 😕


  • Mod

    simcon schrieb:

    Ich glaub, dass ist ein grösseres Problem.

    Ja! Ich sehe ein grundsätzliches Design Problem.

    simcon schrieb:

    Das geht nicht mal so auf die Schnelle.....

    Ja!

    simcon schrieb:

    Ist es überhaupt möglich? 😕

    Ja!



  • Wie meinst Du das mit Design Problem?


  • Mod

    Habe ich doch schon geschrieben: Es ist unsinnig über ein out of proc COM Objekt zum Beispiel Datenbank Zugriffe durchzuführen.
    Es ist IMHO ach unsinnig blockierende UI Zugriffe auf einen Out Of Proc Server durchzuführen.



  • Ich bins mal wieder.....
    Ich weiss jetzt wo das Problem liegt.
    Und zwar ist die 2. Anwendung eine C# Applikation. Diese Applikation hat eine andere Message Pump als die MFC.
    Hat jemand eine Idee, wie ich die Message Pump, oder besser gesagt eine Message von C# im MFC einlesen kann?

    Greetz


  • Mod

    Und? Was spielt das für eine Rolle welche Art von Message Loop verwendet wird?

    Im Kern nutzt jede Message Loop die gleichen Funktionen GetMessage / PeekMessage / TranslateMessage / DispatchMessage. Auch C# Anwednungen sofern Sie als UI laufen und nicht als Console.

    Du hast synchrone COM Aufrufe, soweit ich mich erinnere. Das ist Dein Problem...



  • Seh ich das jetzt falsch?
    Wenn in meiner MCF Applikation eine .net Applikation aufrufe, so ist meine MFC Applikation "gesperrt". Ich muss zuerst die .net Applikation schliessen, um wieder auf die MFC Applikation zu kommen.
    Da ist doch das Problem, dass ich .net Applikation nicht einfach minimieren kann.
    Die Message, die die .net Applikation sendet, kann ich doch in der MFC Applikation nicht empfangen, oder?
    Wenn doch, wie?



  • simcon schrieb:

    Seh ich das jetzt falsch?
    Wenn in meiner MCF Applikation eine .net Applikation aufrufe, so ist meine MFC Applikation "gesperrt".

    WIE *rufst* Du die den auf?????
    IMHO ging es doch darum einen *Prozess* zu _starten_!

    EDIT: Upps... es geht um *synchrone* COM Aufrufe (das kann man aber auch nur erraten, oder Martin?)

    Dann Rate ich diese in einen eigenen Thread auszulagern.



  • Hab ich doch schon erwähnt.
    Ueber eine Instanz:

    hRes = g_pInterface.CreateInstance(__uuidof(Test::TestCOM));
    HookEvent(g_pInterface);
    


  • Jochen Kalmbach schrieb:

    EDIT: Upps... es geht um *synchrone* COM Aufrufe (das kann man aber auch nur erraten, oder Martin?)

    Dann Rate ich diese in einen eigenen Thread auszulagern.



  • Hast Du mir dann mal ein kleines Code Beispiel?
    Muss ich dann anstatt der Instantance ein Thread aufrufen?



  • Zeig mal, WAS denn das problem verursacht!
    Das konnte ich bisher aus Deinem Code noch nicht erkennen...

    Auch: Hast Du "Multi-Threading" bei COM-Aktiviert oder "Apartment-Threading"?



  • Das ganze funktioniert ja. Ich kann aus meiner MFC Anwendung die .net Applikation aufrufen.
    Das Problem ist, wenn die .net Applikation läuft, so kann ich nicht mehr auf meiner MFC Applikation was machen. Ich muss zuert die ..net Applikation schliessen, damit ich wieder bei meine MFC Applikation was machen kann.

    1. MFC Exe ist das Hauptprogramm.
    2. Über Menu wird eine .net Applikation gestartet.
    3. Solange der Dialog der .net Applikation offen ist, kann ich nicht auf der MFC Applikation arbeiten.
    4. Muss .net Dialog zu machen, und dann kann ich wieder auf die MFC Applikation zugreifen.

    Und ich will, dass wenn auch der .net Dialog offen ist, auf meine MFC Applikation zugriff haben.


  • Mod

    Ich habe es Dir doch schon erklärt:
    Du machst einen Aufruf über COM in dem .NET Programm solange ist Deine Anwendung blockiert! Punkt!
    Der COM Aufruf kehrt eben erst zurück, wenn die andere Anwendug damit fertig ist.

    Wenn Du es anders möchtest musst Du den Aufruf auslagern, wie Jochen es erwähnte.



  • Und wie geht das, mit dem auslagern?


  • Mod

    simcon schrieb:

    Und wie geht das, mit dem auslagern?

    Du startest einen anderen Thread mit AfxBeginThread und führst Deinen Befehl von dort aus. (AfxOleInit nicht vergessen).


Anmelden zum Antworten