Prozessproblem...
-
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 damitwhile (::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
