Entwickler-Ecke
Windows API - *jedes*Programm starten und warten bis es fertig geladen ist
firefuzy - Di 14.07.09 21:36
Titel: *jedes*Programm starten und warten bis es fertig geladen ist
Hallo,
Der Titel sagt eigentlich schon alles:
Ich will ein Programm starten und warten bis es vollständig geladen ist.
Gefunden habe ich bereits das hier:
http://www.delphi-forum.de/viewtopic.php?t=75776&highlight=warten+geladen
Das funktioniert allerdings nur wenn die Anwendung ein Fenster hat, was bei mir nicht unbedingt der Fall ist.
Kann man mit der Windows-API vielleicht herausfinden, ob das Programm noch neuen Speicher belegt, oder Dateien von der Festplatte liest?
Oder hat jemand vielleicht eine andere / bessere Idee?
Vielen Dank
firefuzy
BenBE - Mi 15.07.09 08:04
Der von mir dort gepostete Ansatz ist leider der am zuverlässigsten arbeitenste. Für Anwendungen ohne Fenster wäre die Abfrage der prozessspezifischen CPU-Auslastung möglich, was aber zugleich auch etwas umständlicher ist, wenn man dabei nicht sein System durch die ständigen Abfragen ausbremsen will. Zumal es in einem solchen Fall ggf. sinnvoller ist, wenn man mit der Anwendung kommunizieren möchte, dass man wartet, bis deren Kommunikationskanäle erreichbar sind.
Einen generischen Ansatz, wie ich ihn für Programme mit Fenster halbwegs zuverlässig gebaut hab, gibt es nicht, wenn man es vollständig unabhängig machen möchte. Da aber i.d.R. nahezu jedes Programm eine Message-Queue besitzt, funktioniert dieser Ansatz u.U. sogar für einige Programme ohne sichtbares Fenster, solange diese zumindest eine Message-Queue implementieren (brauch man z.B. für eine Reihe von Netzwerk-API-Geschichten).
Ansonsten solltest Du ggf. dein Problem mal etwas genauer spezifizieren.
MfG,
BenBE.
Mitmischer 1703 - Mi 15.07.09 09:53
Schreib dir doch ne batch-Datei!
Wenn du die Programme so aufrufst:
C:\.........\Blubb.exe
C:\.........\Bla.exe
wartet die batch, bis die Progs fertig sind.
OT: Wenn du sie mit einem "start" davor aufrufst, warten das Prog nicht!
BenBE - Mi 15.07.09 10:20
@Mitmischer1703: Bitte schön lesen: Er fragt nach fertig geladen ... Das ist was anderes als fertig ausgeführt. Zudem wartet Start überhaupt nicht, sondern macht einfach nur ein CreateProcessEx und kehrt dann wieder zurück.
Reinhard Kern - Mi 15.07.09 16:10
firefuzy hat folgendes geschrieben : |
Hallo,
Der Titel sagt eigentlich schon alles:
Ich will ein Programm starten und warten bis es vollständig geladen ist.
|
Hallo,
dafür kann es keine allgemeine Lösung geben, jedenfalls nicht ohne Kooperation des fraglichen Programms. Nimm z.B. Nero: erst wenn du angibst, ob du Daten- oder Audio-CDs usw. machen willst, wird überhaupt der Hauptteil der (jeweiligen) Software geladen.
Ich lade manche exotischen Programmteile (DLL) oder Daten auch erst, wenn sie mal gebraucht werden. Selbst wenn ich eine Message "Hello I am ready" versenden würde, würde sie nicht für alle Fälle gelten.
Gruss Reinhard
PS: die Idee, dass jede Anwendung eine Bereit-Message versenden sollte, wäre nicht schlecht, aber das hätte man wohl mit Bill Gates noch vor 1980 vereinbaren müssen.
firefuzy - Mi 22.07.09 13:35
| Zitat: |
| Ansonsten solltest Du ggf. dein Problem mal etwas genauer spezifizieren. |
Generell will ich mehrere Anwendungen starten. Wenn ich allerdings einfach alle ausführen würde, würde dass laden ziemlich lange dauern, da diese bei gleichzeitigem Start die Kapazität der Festplattenzugriffe und CPU-Leistung überfordern. Dann könnte der Anwender mit dem PC quasi nicht mehr arbeiten, während die Programme geladen werden.
Deshalb wollte ich die Programme nacheinander starten, da so der PC nicht so stark überfordert wird und für den Anwender nebenher benutzbar bleibt.
Bei den Anwendungen handelt es sich teilweise um Services, die nur im Hintergrund laufen und keine Fenster haben.
Ich probiere mal, ob der Ansatz mit der Message-Queue trotzdem funktioniert, ansonsten werde ich mal den Ansatz, die CPU-Auslastung zu ermitteln, anschauen...
MfG
firefuzy
Gausi - Mi 22.07.09 13:43
Wie wäre denn die triviale Methode, zwischen zwei Aufrufen von ShellExecute einfach etwas zu warten? Bei Programmen mit Fenstern kannst du es ja so machen wie weiter oben verlinkt, aber wenn es um Services geht, die ja wohl einzeln für sich alle relativ klein sein dürften, würde ich einfach ein paar Sekunden warten (so 1-5?), und dann das nächste Ding starten. :nixweiss:
ffgorcky - Mi 22.07.09 15:23
Also wenn Du auch das gestartete Programm beeinflussen kannst, dann könntest Du ja z.B. eine Datei anlegen, die dann beim Start immer z.B. den Inhalt "gestartet" und beim beenden "beendet" (natürlich jeweils ohne die Hochkommas!) drin stehen hat.
Ich weiß allerdings leider auch gerade nicht, ob es nicht noch eine sauberere Methode gäbe...
...wenn es Dir noch nicht reicht, zu gucken, ob es den Prozess schon gibt.
AHT - Fr 31.07.09 16:15
firefuzy hat folgendes geschrieben : |
Hallo,
Ich will ein Programm starten und warten bis es vollständig geladen ist.
|
Was heißt "vollständig geladen"?
AHT - Fr 31.07.09 16:51
Mal eine unkonventioneller Denkansatz für NT-basierende Systeme...
Ein Thread dürfte sich, wenn er beschäftigt ist, im Status "läuft" (= 2) befinden.
Ruht er, dürfte er in den Status "wartet" (=5) oder "bereit" (=1) übergehen.
Der Status lässt sich über die API NtQuerySystemInformation mit der InformationClass SystemProcessesAndThreadsInformation (5) ermitteln.
Für das hier angesprochene Problem würde ich zwischen den einzelnen Programmaufrufen aber auch lieber selbst etwas "warten" und nicht prüfen, ob das gestartete Proggie in einem "Wartestatus" ist.
BenBE - Fr 31.07.09 16:56
@AHT: Sind das nicht eigentlich 3 Flags: Sleep, Running und Ready? Der Ansatz hat aber trotzdem den Nachteil, dass man nur schwerlich mitbekommt, ob der andere Prozess wirklich "bereit" ist für Eingaben.
Am Sinnvollsten ist von daher immer noch die Variante mit dem Schauen, ob die gewünschten Kommunikationsmittel bereits akzeptiert und bearbeietet werden.
AHT - Fr 31.07.09 17:00
BenBE hat folgendes geschrieben : |
@AHT: Sind das nicht eigentlich 3 Flags: Sleep, Running und Ready? Der Ansatz hat aber trotzdem den Nachteil, dass man nur schwerlich mitbekommt, ob der andere Prozess wirklich "bereit" ist für Eingaben.
Am Sinnvollsten ist von daher immer noch die Variante mit dem Schauen, ob die gewünschten Kommunikationsmittel bereits akzeptiert und bearbeietet werden. |
Nein, soweit ich weiß 6 Flags, nicht drei.
AHT - Fr 31.07.09 17:22
| Zitat: |
Am Sinnvollsten ist von daher immer noch die Variante mit dem Schauen, ob die gewünschten Kommunikationsmittel bereits akzeptiert und bearbeietet werden. |
Für das was hier gefragt wurde, auf jeden Fall.
Eines von meinen Proggies (scannt nach einer neuen Art von RootKits) zeigt mir unter anderem auch diesen Status an.
Da kann man sehr schön sehen, welcher Thread sehr viel zu ackern hat und welcher Thread momentan wohl eine ganz ruhige Kugel schiebt - deswegen mein kleiner "Brainstormingansatz" hier.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!