Prozessproblem...



  • Ich sag dazu nix mehr. Ich weis echt nicht warum das in meinem grossen Programm nicht geht. Ich hab jetzt gerade ein Testprogramm geschrieben, das nur einen Prozess - also Excel - startet; Fazit: Ich kann alles öffnen, jedes Dokument startet sofort die dafür vorgesehene Anwendung.
    Jetzt mache ich dasselbe in meinem großem Programm, siehe da: Dasselbe Problem mit genau demselben Code. Ich kapier das nicht. Verbraucht mein Prog mehr speicher oder wie? Was mir auch noch aufgefallen ist, bei meinem großem Programm: Wenn er Excel geladen hat, und ich mit der Maus auf z.B. dem Desktop eine DOC-Datei anklicke, kommt als Cursor der Mauszeiger mit einer Sanduhr. Wenn ich nun das Excel-Fenster verschiebe updated sich gar nix mehr auf dem Desktop, d.h. ich kann die Icons sozusagen damit "wegwischen". Beende ich die Anwendung nun starten alle geklickten files. Wenn ich nix doppelklicke kann ich das Fenster verschieben und Windows läuft ganz normal...

    Schalte ich da vielleicht irgendwie was aus, was das halbe System lahmlegt? Ich kann das Programm leider hier nicht posten da es Strenger Geheimhaltung unterliegt ... und im Testprogramm gehts 😡 blödes Windows 👎 ... ich verstehe das einfach nicht...

    Gruss,
    ~code_pilot 😞



  • beantworte mal flenders Frage



  • ok aber kann ich erst heut abend machen habe die Sourcen nicht hier - ausser die vom laufendem Testprog *grummel*

    ~cp



  • Hast du evtl. ein Memory-Leak? Und wird dein Fenster denn noch korrekt aktualisiert (z.B. nach dem Minimieren)?



  • flenders schrieb:

    Hast du evtl. ein Memory-Leak? Und wird dein Fenster denn noch korrekt aktualisiert (z.B. nach dem Minimieren)?

    Hallo,
    habs heute getestet ohne das WaitForSingleObject() ... funkt alles wunderbar! Was genau meinst du mit Memory-Leak? Meine Anwendung hat kein direktes Fenster, die Fenster werden nur als Dialoge bei Bedarf eingeblendet. Ein Hauptfenster existiert nicht. Aber es muss ja irgendwas mit meinem Programm-Framework zu tun haben und nicht mit dem WaitForSingleObject() selber ... hmmm warum kann es nicht einfach abstürzen wenn da was falsch allokiert ist oder so? Dann hätte man wenigstens einen Ansatz woran es liegt, in diesem Fall kann es ja an allem möglichen liegen... 😡

    Liegt das vielleicht an der Fensterklasse?

    Grüsse,
    ~code_pilot 😞



  • ne falsch allokaliert kann es eigentlich kaum sein...höchstens wenn es beim ersten Start geht, du falsch aufräumst und beim nächsten Start funktionierts dann nicht mehr....na wenigstens lag ich mit dem WaitForSingleObject doch richtig! ha! 🙂
    An deiner Stelle würde ich soweit in einem externen Programm rekonstruieren bis der Fehler auftritt, so kannste den Heuhaufen dezimieren.

    Gruß,
    Kevin



  • ähh? Wie meinst du das? 🙄



  • Hattest du das WaitForSingleObject in deinem Testprogramm eigentlich auch eingebaut?



  • Ja na sicher hatte ich das da eingebaut, sonst würde ich mich ja nicht so wundern (ich habs mit WaitForSingleObject UND WaitForSingleObjectEx probiert, und das Testprogramm einmal in einer Konsolen- und einmal in einer WinAPI-Version (wiefolgt) implementiert):

    #include <windows.h>
    #include <string.h>
    #include <fstream.h>
    #include <stdlib.h>
    #include <stdio.h>
    #pragma hdrstop
    #include <condefs.h>
    
    //---------------------------------------------------------------------------
    #pragma argsused
    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
                    STARTUPINFO si;
                    PROCESS_INFORMATION pi;
                    SECURITY_ATTRIBUTES saProcess;
                    ZeroMemory( &si, sizeof(si) );
                    si.cb = sizeof(si);
                    ZeroMemory( &pi, sizeof(pi) );
                    si.dwFlags = STARTF_USESHOWWINDOW;
    
                    saProcess.nLength = sizeof(saProcess);
                    saProcess.lpSecurityDescriptor = NULL;
                    saProcess.bInheritHandle = FALSE;
    
                    si.wShowWindow = SW_SHOW;
    
                    /*Lasst euch hiervon nicht irritieren, bei mir im Hauptprogramm
                    geschieht der aufruf nunmal fast so ;), deshlab string und
                    ein Array of Char ;) */
    
                    char text[1024+1];
                    string TempStr1 = "D:\\Programme\\Microsoft Office\\Office\\excel.exe";
                    strcpy(text, TempStr1.c_str());
                    MessageBox(NULL, "Starting process...", "", 0);
                    if( !CreateProcess( NULL, text, &saProcess, NULL, FALSE, 0, NULL, NULL, &si, &pi) )
                    {
                            return -1;
                    }
                    else
                    {
                            DWORD dwCode = WaitForSingleObjectEx(pi.hProcess,INFINITE, false);
                            GetExitCodeProcess(pi.hProcess,&dwCode);
                    }
                    MessageBox(NULL, "Done", "", 0);                
            return 0;
    }
    


  • Hey,
    wozu brauchst du das WaitForSingleObject eigentlich? Gibt es vielleicht eine andere Möglichkeit als CreateProcess? ZB WinExec? Sag doch mal konkret was du erreichen willst...man muss ja nicht immer das Problem aus dem Weg schaffen sondern kann einen anderen Weg außenrum wählen 🙂

    Gruß,
    Kevin



  • @Surkevin: Ich will ein Programm so starten, dass das startende Programm wartet, bis das gestartete Programm beendet wurde - danach soll es normal weiterlaufen. Zudem benötige ich den Rückgabewert des gestarteten Programms (GetExitCodeProcess()) und es sollen Modis wie SW_SHOW, SW_HIDE, SW_MINIMIZED usw. übergeben werden können - das alles bieten ja Prozesse - nur hab ich da (oder Windows :D) wohl irgend einen Bug, denn es geht ja im kleinen Testprogramm aber nicht im großem Hauptprogramm. Da es ja im kleinen geht muss es ja mit meinem Hauptprogramm zu tun haben, nur kann es da 1000de Faktoren geben die das (irgendwie) beeinflussen können ... Hmmmm ... und WinExec() erlaubt nicht das Warten bis eine Anwendung beendet wurde, hab ich jedenfalls noch nie gehört.

    Als denn, gute Nacht 😉

    code_pilot



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


Anmelden zum Antworten