Prozessproblem...



  • @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