Prozessmanagement
-
Hallo,
hab ein C-Programm geschrieben, das ein anderes Programm immer wieder mit verschiedenen Kommandozeilenargumenten aufruft (mit CreateProcess(...)). Das Programm funktioniert soweit auch, hab aber jetzt folgendes Problem: wenn ich mein Programm verwende, um das andere auszuführen, braucht es bei einem Aufruf ca. doppelt so lang um die Berechnungen durchzuführen (ca. 4 min), als wenn ich das auszuführende Programm "von Hand" starte (ca. 2 min). Da ich ca. 1000 Aufrufe durchführen will, würde es mich freuen, wenn irgendjemand ne Idee hat, wie man das lösen kann (z.B. durch Zuweisung von Rechenzeit oder so... kenn mich da leider nicht aus).
Hoffe es ist klar geworden wo das Problem liegt.Dankeschön!
MFG
Barney
-
Das Starten von Prozessen ist bei Windows extrem langsam. Falls es ein wichtiges Programm ist, lohnt es sich vielleicht, einen Rechner mit Linux aufzusetzen.
Ansonsten kann man von der Technik, ein Programm tausendmal aufzurufen, nur abraten. Bei Windows sprechen ganz klar die Performance-Gruende dagegen.
Besser ist es, das aufzurufende Programm in das eigene zu integrieren, falls der Programmtext verfuegbar ist.
-
Power Off schrieb:
Das Starten von Prozessen ist bei Windows extrem langsam.
dauert aber keine 2 minuten
@fragesteller: was macht das 'starterprogramm' in der zwischenzeit? kann es sein, dass es dem system rechenzeit entzieht? ansonsten kannste die priorität des gestarteten programms hochsetzen. guckst du: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/setthreadpriority.asp
und: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/setpriorityclass.asp
-
Hallo,
nein, der Prozess, der das Programm aufruft wartet nur, bis das Programm fertig ist, um es dann erneut aufzurufen.
Habs jetzt mal mit SetPriorityClass(...) versucht:if ( CreateProcess( EXE, // auszuführende Datei mit vollst. Pfad argumente, // Kommandozeilenargumente NULL, NULL, true, CREATE_DEFAULT_ERROR_MODE, NULL, PFAD, // Pfad, indem das auszuführende Programm liegt &start_info, // StartupInfo &proc_info // erhält Infos über den aufgerufenen Prozess ) == 0 ) { printf("Fehler beim Starten des Programms\n"); exit (1); } HANDLE hprocess = proc_info.hProcess; unsigned long ExitCode; if ( SetPriorityClass(hprocess, HIGH_PRIORITY_CLASS) == NULL) { printf("Prioritaet konnte nicht erhoeht werden!\n"); exit (1); }
So klappt das auch und geht viel schneller, nur das dann sonst überhaupt nichts mehr geht bis das Programm beendet ist. Da ich ME hab und das Prog auch auf NT laufen sollte, geht ein kleinerer Level als HIGH_PRIORITY_CLASS nicht.
Bei SetThreadPriority(...) hab ich das Problem, dass THREAD_SET_INFORMATION gesetzt sein muss. Hab mir das mal angeschaut, aber kapier leider nicht, wie das genau geht. Hat das jemand schonmal benutzt oder kann mir sagen, wie ich das machen muss? Bei SetThreadPriority(...) könnte ich die Prioritaet wohl stufenweise erhöhen und schauen, was am besten passt.
Danke für eure Hilfe!
MFG
Barney
-
nicht böse gemeint - aber gehört das nicht mehr nach WinAPI? die leute da sollte mehr drüber wissen
-
ok, werds da mal versuchen...
Danke nochmals!
-
Barney schrieb:
Hallo,
nein, der Prozess, der das Programm aufruft wartet nur, bis das Programm fertig ist, um es dann erneut aufzurufen.zeig mal wie es wartet. wenn du's anders machst als mit 'WaitForSingleObject()' könnte es schon wertvolle rechenzeit verballern
-
mach es so:
// Auf Prozessende warten do if (!GetExitCodeProcess(hprocess, &ExitCode)) { printf("Prozess konnte nicht gefunden werden\n"); exit(1); } while (ExitCode == STILL_ACTIVE);
-
Hey Leute, hier geht es nur um ANSI C! Stell euere Fragen und Antworten in richtigen Forum
-
Barney schrieb:
// Auf Prozessende warten do if (!GetExitCodeProcess(hprocess, &ExitCode)) { printf("Prozess konnte nicht gefunden werden\n"); exit(1); } while (ExitCode == STILL_ACTIVE);
aha
die do/while-schleife verbläst cpu-cycles ohne ende.
mach es so ungefähr:WaitForSingleObject (hprocess, INFINITE);
supertux schrieb:
Hey Leute, hier geht es nur um ANSI C! Stell euere Fragen und Antworten in richtigen Forum
wie heisst das zauberwort?
-
net schrieb:
wie heisst das zauberwort?
SOFORT!
-
supertux schrieb:
net schrieb:
wie heisst das zauberwort?
SOFORT!
aufgrund eures gemeckers läuft die diskussion jetzt in zwei threads ab, einmal hier und einmal im winapi-forum. anstatt zu warten bis ein mod das verschiebt... tztztz...
-
oki, so klappts auch!
Muchas gracias!
MFG
Barney