wie mache ich das in MFC?



  • hallo,
    Ich haette da zwei fragen:

    1. Frage:
    ----------
    ich habe eine mfc-anwendung in der ich externe programme aufrufen muss.
    dies habe ich WinAPI gemaess so gemacht:

    // ... 
    SHELLEXECUTEINFO sei; 
    ZeroMemory( &sei, sizeof( sei ) ); 
    sei.cbSize       = sizeof( sei ); 
    sei.fMask        = SEE_MASK_NOCLOSEPROCESS; 
    sei.lpFile       = LPCTSTR(msg); 
    sei.lpParameters = NULL; 
    sei.lpDirectory  = NULL; 
    sei.nShow        = SW_HIDE; 
    // ... 
    SetCursor(LoadCursor(NULL, IDC_WAIT));
    ShellExecuteEx( &sei ); 
    if ( sei.hProcess ){ 
    	// warte bis der prozess beendet wurde.... 
    	WaitForSingleObject( sei.hProcess, INFINITE ); 
    	CloseHandle( sei.hProcess ); 
    }
    SetCursor(LoadCursor(NULL, IDC_ARROW));
    

    mein problem ist, dass ich nicht auf diese art auf das beenden des programms warten moechte. Die Oberflaeche scheint zu "haengen" bei solch obigem aufruf.

    Wie wuerde man das mit MFC Thread maessig machen?

    2. Frage:
    ----------
    Angenommen ich muesste ein externes Programm aufrufen und moechte nun solange dieses programm laeuft eine progress-bar anzeigen. Wie kann ich dann feststellen wie lange das externe programm noch laufen wird um die progress-bar zu aktualisieren??? (Bei obiger vorgehensweise ist das sowieso ein problem glaube ich).

    vielen dank vorab.

    gruss



  • Zu deiner 1. Frage:
    -------------------

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/creating_processes.asp

    vieleicht hilft das ein wenig

    Zu deiner 2. Frage:
    -------------------

    Viel Glück!



  • kummerle schrieb:

    Wie kann ich dann feststellen wie lange das externe programm noch laufen wird um die progress-bar zu aktualisieren???

    das geht nur, wenn du ein versprechen hast, wie lange es mindestens läuft. sagenb wir mal, du weißt sicher, daß es mindestens 25 sekunden läuft. es kann aber auch 25 minuten laufen. dann schieß es einfach immer nach 20 sekunden ab. dann kannste deinen progress bar pro sekunde um 5% vorrücken lassen und bei 100% endet der prozess auch. ganz wie der benutzer es mag.

    edit: poristen mögen einwenden, daß man den prozess sofort killen kann, das macht die berechnung noch einfacher und man braucht kein versprechen.
    edit2: vielleicht könnte man den thread suspended starten. gibts dafür befehle? für konsole-anwendungen kann man ein- und ausgabe auf stillgelegte pipes legen. für andere müßte man evtl code injizieren. aber man schafft es bestimmt, daß auch prozesse, die das eigentlich nicht wollten, genau 20 sekunden lang laufen.



  • derBob schrieb:

    Zu deiner 2. Frage:
    -------------------

    Viel Glück!

    Was meinst Du damit :)? Das das nicht geht oder das Du nicht weisst wie es geht und mir bei der Suche der Loesung Glueck wuenscht oder was nu :)?!

    gruss



  • kummerle schrieb:

    Was meinst Du damit :)? Das das nicht geht oder das Du nicht weisst wie es geht und mir bei der Suche der Loesung Glueck wuenscht oder was nu :)?!

    viel glück beim RATEN, wie lange der andere prozess vor hat, zu laufen.
    wie lange läuft zum beispiel "dir c:\. /s>t.txt"?`
    bei einigen sind nur 50000 files auf c, bei anderen 300000. ist das current directory, wo t.txt landet ne ramdisk oder ne diskette? nd vor allem, ist der verzeichnisbaum im cache oder nicht. der prozess läuft gerne zum ersten mal ne minute lang und beim zweiten mal nur 5 sekunden. und keiner weiß es vorher genau.



  • Ist ja ne witzige Frage.
    Nichmal der BS-Herrsteller weiß wie lange sein BS läuft. Manchmal startet es nicht mal. Manchmal soll es angeblich auch schon ein Monat ohne Abstürt überlebt haben.
    Ich starte mein Outlook z.B. am Tag zw. 2 und 10 Stunden.
    Wäre schon wenn es ein Programm geben würde das vorhersagt wie lange ich mein Outlook offen lasse. Dann weiß ich in der Früh immer wie lange ich arbeite.



  • Ich möchte ein Cab File mit Shellexecute starten!

    Möchte aber die Option mitgeben das beim entpacken die Dateien direkt überschrieben werden!

    Wie mache ich das?


Anmelden zum Antworten