Autor |
Beitrag |
firefuzy
      
Beiträge: 69
Win 98 SE, WinXP Prof, Vista HPrem.
Delphi 7
|
Verfasst: Di 14.07.09 21:36
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:
www.delphi-forum.de/...light=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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Mitmischer 1703
      
Beiträge: 754
Erhaltene Danke: 19
Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
|
Verfasst: 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!
_________________ Die Lösung ist nicht siebzehn.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: 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 
      
Beiträge: 69
Win 98 SE, WinXP Prof, Vista HPrem.
Delphi 7
|
Verfasst: 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
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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. 
_________________ We are, we were and will not be.
|
|
ffgorcky
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: 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
      
Beiträge: 207
|
Verfasst: 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
      
Beiträge: 207
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
AHT
      
Beiträge: 207
|
Verfasst: 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
      
Beiträge: 207
|
Verfasst: 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.

|
|
|