Prozessproblem...



  • Hallo,

    PSDK schrieb:

    Note This function is provided only for compatibility with 16-bit Windows. Applications should use the CreateProcess function.

    Wozu braucht man noch WinExec?

    MfG
    tuküe



  • Der Einfachkeithalber?
    Hast du mal Rebuild All gemacht? Im Release und Debugmodus ausprobiert und es verschiedene Betriebssysteme/Computer getestet? Spiel mal ein bisschen mit den Parametern bei CreateProcess rum...andere Priority etc.
    Gruß,
    Kevin



  • ich glaube nicht daß das Problem am Speicherverbrauch o.ä. liegt. Die einzelnen Office-Anwendungen versuchen jam, mit einer Anwendung auszukommen.

    D.h: Du öffnest ein Dokument in Word, und doppelklickst ein zweites. Word wird zwar Zwei Einträge in der Taskleiste anzeigen (seit Word 2000 glaub ich), aber es gibt nur einen Prozeß (Taskmanager, Prozeßliste).

    jetzt Schritt 2: In Word Hilfe/Info... (modalen Dialog öffnen), und Word-Dokument doppelklicken. Word kommt in den Vordergrund, aber nix passiert - bis du den Modalen Dialog schließt. Interessanterweise läuft die ganze Zeit keine zweite Instanz, obwohl der "Öffnen" Befehl eine startet - ich vermute (auch aus anderen Gründen), Office startet für jedes Dokument einen eigenen thread.

    Nun versteh ich trotzdem nicht wieso das auch zwischen Excfel und Word passiert. Aber ich denke, daß Du den Office-Dokumenthandler irgendwie "durcheiunanderbringst".

    Also kleine Ahnung, aber ich denke das Problem liegt in der Richtung 😉



  • manche programme (hauptsächlich grössere MS sachen wie IE, oder eben office) "vertragen" es nicht, wenn man auf sie mit WaitForSingleObject wartet

    keine ahnung warum, ist mir aber auch schon öfters aufgefallen

    und ich glaube, da kann man nix gegen machen



  • hmk

    "Sometimes applications broadcast messages to some or all other windows on the system. In this event the above method will cause a deadlock situation if the waiting application is not free to process messages. If the waiting application is waiting in its thread that processes window messages, then no messages can be processed until the wait is complete."

    deine app muss also fenstermessages weiterverarbeiten, wasse aber nich macht
    probiers mal damit

    while (::PeekMessage (&message.msg, NULL, 0, 0, PM_NOREMOVE))
    {
    if (::GetMessage(&message.msg, NULL, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }

    if (WaitForSingleObject(xPi.hProcess, 0)
    break;
    }



  • @0rp: Hört sich ja net schlecht an. Aber wie muss ich denn jetzt da einbauen? Ne komplett neue WndProc basteln oder wie sieht das aus? Wo muss das WaitForSingleObject() hin?

    Danke & Grüsse, ~cp



  • du musst dein Wait.. durch den oben genannten code ersetzen.

    weil die schleife returned erst, wenn der prozess weg ist, arbeitet aber zusätzlich noch wnd messages weiter ab.



  • @0rp:

    Tut mir leid, er startet zwar das Programm, aber fährt dann einfach fort und wartet nicht. Mein Code:

    //WaitForSingleObject( pi.hProcess, INFINITE );
                            MSG message;
                            while (PeekMessage (&message, NULL, 0, 0, PM_NOREMOVE))
                            {
                                    if (GetMessage(&message, NULL, 0, 0))
                                    {
                                            TranslateMessage(&message);
                                            DispatchMessage(&message);
                                    }
    
                                    if(WaitForSingleObject(pi.hProcess, 0)) break;
                            }
                            DWORD dwCode;
                            GetExitCodeProcess(pi.hProcess,&dwCode);
    
                            sprintf(text, "%d", dwCode);
    

    😞

    ~cp



  • ersetz mal die wait zeile durch

    if(WaitForSingleObject(pi.hProcess, 0) == WAIT_OBJECT_0) break;



  • macht doch keinen unterschied 🙂



  • sicher machts einen unterschied, WAIT_OBJECT_0 is ja 0 und nicht ungleich 0

    aber es wird trotzdem nicht funktionieren

    weiss jetzt auch nich, wie man das besser machen könnte



  • das ist 0? Ok nächstes mal schau ich nach dem define bevor ich so vorlaute Bemerkungen abgeb *schäm*



  • 0rp schrieb:

    weiss jetzt auch nich, wie man das besser machen könnte

    😞 🙄



  • du könntest im notfall ohne das WaitForSingleObject einen Timer erstellen der alle 0,5 Sekunden (oder vielleicht einen eigenen Thread?) überprüft, ob der Prozess noch existiert...



  • Habs grad mal getestet, geht aber immernoch nicht (übrigens teste ich derzeit Zuhause auf dem Rechner von meinen Eltern (ich selbst haber kein Office) die haben Office 95 (!) und da hat er genau dasselbe Problem wie mit 2000 auf der Arbeit...

    Mein Testcode:

    while(WaitForSingleObject(pi.hProcess, 100) == WAIT_TIMEOUT);
    

    @surkevin: du hast was geschrieben ohne das WaitForSingleObject() ... wie? Also wie kann ich noch überprüfen ob der Prozess noch läuft...

    Hmm...

    ~code_pilot



  • Da gibt es wirklich viele Methoden, zwei die mir spontan einfallen:
    CreateProcess liefert dir ja in einem struct die ProcessID (pid)...nun überprüfst du ob du mittels OpenProcess(...pid...) ein gültiges Handle bekommst, wenn ja -> existent, wenn nicht -> nicht mehr offen 🙂
    Dann könntest du noch eine Liste aller offenen Prozesse holen und überprüfen ob bei diesen deine pid dabei ist....wenn es Fragen dazu gibt, tu dir keinen Zwang an 🙂

    Gruß,
    Kevin



  • Habt ihr mal versucht, die beiden Handles, die von CreateProcess in die übergebene PROCESS_INFORMATION-Struktur geschrieben werden, nach dem Warten zu schließen? (sollte man sowieso immer machen -> es gibt sonst ein Ressource-Leak)



  • ändert nix am ergebnis und mich würde es ehrlich gesagt wundern, wenn man die Handles explizit in diesem Fall schließen müssen...denke das ist eher Zusatzinfo...ich hoffe ich behaupte hier nicht wieder vorschnell.



  • lpProcessInformation
    [out] Pointer to a PROCESS_INFORMATION structure that receives identification information about the new process.
    Handles in PROCESS_INFORMATION must be closed with CloseHandle when they are no longer needed.

    Die Message-Loop ist so wie (zu Beginn) gepostet irgendwie sinnlos, denn wenn keine Messages da sind liefert PeekMessage gleich zu Beginn 0 zurück und die while-Schleife wird verlassen. Versuch es mal so (ungetestet):

    MSG message;
    while(WaitForSingleObject(pi.hProcess, 10) == WAIT_TIMEOUT) // ich denke, dass der Wert 0 nur unnötig die CPU-Last erhöht - evtl. sogar noch größer als 10 wählen
    {
        if(PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&message);
            DispatchMessage(&message);
        }
    }
    // nochmals checken, ob der Prozess auch wirklich beendet wurde (es kann ja auch ein Fehler gegeben haben)
    if(WaitForSingleObject(pi.hProcess, 0) == WAIT_OBJECT_0)
    {
        DWORD dwCode;
        GetExitCodeProcess(pi.hProcess,&dwCode);
        sprintf(text, "%d", dwCode);
    }
    


  • @flenders
    Hey super, es funktioniert!!!! 🙂 vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen Dank!

    Grüsse,
    ~cp code_pilot


Anmelden zum Antworten