AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Externes programm starten und warten bis dieses "bereit" ist
Thema durchsuchen
Ansicht
Themen-Optionen

Externes programm starten und warten bis dieses "bereit" ist

Ein Thema von erik-17 · begonnen am 10. Mai 2011 · letzter Beitrag vom 11. Mai 2011
Antwort Antwort
Seite 1 von 2  1 2      
erik-17

Registriert seit: 8. Apr 2010
51 Beiträge
 
Delphi 3 Professional
 
#1

Externes programm starten und warten bis dieses "bereit" ist

  Alt 10. Mai 2011, 20:06
Hallo,

ich hab ein Problem: Mein Programm ruft ein anderes Programm auf, und soll nun solange nichts tun (warten), bis dieses andere Programm sozusagen bereit ist.
In meinem Fall ist es Firefox, der starten soll. (Weil der nicht immer gleich lange braucht, ist sleep unangebracht ).
Habt ihr dafür vielleicht irgendwelche Ideen.
Meine einzige ist: immer wieder zu prüfen, ob der andere Prozess schon eine bestimmte Ram-Größe eingenommen hat und darauf dann zu regieren. Aber wie stellt man so etwas an ??

Danke schon im voraus
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#2

AW: Externes programm starten und warten bis dieses "bereit" ist

  Alt 10. Mai 2011, 20:12
Eventuell hiermit:

http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

HTH
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#3

AW: Externes programm starten und warten bis dieses "bereit" ist

  Alt 10. Mai 2011, 20:13
Wenn Du den fremden Prozess via CreateProcess starten kannst, dann kannst Du einfach die WinAPI-Funktion WaitForInputIdle verwenden. Abhängig vom fremden Programm kann das aber auch in die Hose gehen, da geht Probieren vor Studieren.
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
WladiD

Registriert seit: 27. Jan 2006
Ort: Celle
135 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Externes programm starten und warten bis dieses "bereit" ist

  Alt 10. Mai 2011, 20:31
Schaue dir mal die Komponente TJvShellHook aus der JVCL an.

Das Event OnShellMessage kannst du dann verarbeiten:

Delphi-Quellcode:
procedure TForm1.ShellHookDispatcher(Sender:TObject; var Message:TMessage);
begin
   case Message.WParam of
      HSHELL_WINDOWCREATED:
         // Fenster erstellt
      HSHELL_WINDOWACTIVATED,
      HSHELL_RUDEAPPACTIVATED:
         // Der nächste Sprung hierher nach
         // HSHELL_WINDOWCREATED bedeutet,
         // dass das Fenster bereit ist...
   end;
end;
In Message.LParam ist stets das Window-Handle enthalten.

Achso, die obige Prozedur muss nur aktiviert werden, bevor du das externe Programm startest.
Waldemar Derr
  Mit Zitat antworten Zitat
doctor-x

Registriert seit: 29. Apr 2007
41 Beiträge
 
#5

AW: Externes programm starten und warten bis dieses "bereit" ist

  Alt 11. Mai 2011, 01:30
Hi,
ich hab das mal irgendwo hier gefunden udn benutze es auch

Code:
Function CreateProcessWaitReady(ProgramFile: String; Commandline: String = ''; CurrDir: String = '.'): Boolean;
Var
    StartInfo: TStartupInfo;
    ProcInfo: TProcessInformation;

    WFSO: DWORD;
    SMT_Count: Integer;
    SMT_Done: Boolean;
Type
    TEWPInfo = Packed Record
        PI: PProcessInformation;
        SMTD: PBoolean;
    End;
    PEWPInfo = ^TEWPInfo;
Var
    EWPI: TEWPInfo;

    Function ETWProc(wnd: HWND; Param: PEWPInfo): Boolean; Stdcall;
    Var
        Res: DWORD;
    Begin
        If SendMessageTimeoutA(
            wnd,
            WM_NULL,
            0,
            0,
            SMTO_ABORTIFHUNG,
            50,
            Res) <> 0 Then
        Begin
            Param.SMTD^ := True;
            Sleep(10);
        End;
        Result := Not Param.SMTD^;
    End;

Begin
    FillChar(StartInfo, SizeOf(TStartupInfo), #0);
    FillChar(ProcInfo, SizeOf(TProcessInformation), #0);
    StartInfo.cb := SizeOf(TStartupInfo);
    StartInfo.dwFlags := STARTF_USESHOWWINDOW Or STARTF_USEPOSITION Or STARTF_USESIZE;
    StartInfo.wShowWindow := SW_SHOW;

    Commandline := Format('"%s" %s', [ProgramFile, Trim(Commandline)]);

    Result := CreateProcess(
        Nil,
        pChar(Commandline),
        Nil,
        Nil,
        true,
        NORMAL_PRIORITY_CLASS,
        Nil,
        pChar(CurrDir),
        StartInfo,
        ProcInfo
        );

    If Result Then
    Begin
        SMT_Count := 0;
        EWPI.PI := @ProcInfo;
        EWPI.SMTD := @SMT_Done;
        Repeat

            //At first check if the process is still running (and lower CPU load) ...
            WFSO := WaitForSingleObject(ProcInfo.hProcess, 100);

            //Now check for at least one window that
            SMT_Done := False;
            EnumThreadWindows(ProcInfo.dwThreadId, @ETWProc, Integer(@EWPI));
            If SMT_Done Then
                Inc(SMT_Count)
            Else
                SMT_Count := 0;
        Until (WAIT_OBJECT_0 = WFSO) Or (SMT_Count >= 10);

        Result := SMT_Count >= 10;
    End;

    If ProcInfo.hProcess <> 0 Then
        CloseHandle(ProcInfo.hProcess);
End;
und

Code:
function AppActivate(const WindowName: PChar) : Boolean;
var
  WindowHandle: THandle;

  function EnumWindowsProc(WHandle: HWND; lParam: LPARAM): BOOL; export; stdcall;
  const
    MAX_WINDOW_NAME_LEN = 80;
  var
    WindowName: array[0..MAX_WINDOW_NAME_LEN] of char;
  begin
    {Can't test GetWindowText's return value since some windows don't have a title}
    GetWindowText(WHandle, WindowName, MAX_WINDOW_NAME_LEN);
    Result := (StrLIComp(WindowName, PChar(lParam), StrLen(PChar(lParam))) <> 0);
    if (not Result) then WindowHandle := WHandle;
  end;

begin
  try
    Result := True;
    WindowHandle := FindWindow(nil, WindowName);
    if (WindowHandle = 0) then EnumWindows(@EnumWindowsProc, Integer(PChar(WindowName)));
    if (WindowHandle <> 0) then begin
      SendMessage(WindowHandle, WM_SYSCOMMAND, SC_HOTKEY, WindowHandle);
      SendMessage(WindowHandle, WM_SYSCOMMAND, SC_RESTORE, WindowHandle);
      Sleep(100);
    end else Result := False;
  except
    on Exception do Result := False;
  end;
end;
zum teil ging es mit CreateProcessWaitReady alleine nicht, da hab ich dann folgendes gemacht:

Code:
if not AppActivate(CMainWindowName) then begin
  CreateProcessWaitReady(ApplicationExePath, '');
  Count := 0;
  repeat
    Sleep(10);
    Inc(Count);
  until AppActivate(CMainWindowName) or (Count >= CMaxCounter);
end;
Hoffe es hilt weiter

MfG
Wolf
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#6

AW: Externes programm starten und warten bis dieses "bereit" ist

  Alt 11. Mai 2011, 05:48
Es gibt auch schon einige Threads dazu ... hier einige Suchworte
Hier im Forum suchenShellExecuteEx / MSDN-Library durchsuchenShellExecuteEx
Hier im Forum suchenShellExecAndWait
Hier im Forum suchenShellExecuteAndWait
Hier im Forum suchenShellExecute_AndWait

Eigentlich stand auch mal was in der CodeLib aber irgendwie kann ich's nicht mehr finden.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#7

AW: Externes programm starten und warten bis dieses "bereit" ist

  Alt 11. Mai 2011, 10:21
Uh, Himitsu, ShellExecuteEx und Co sind eine andere Baustelle... Ich vermute mal Kaffeemangel?
Für ShellExecuteEx gibts doch tatsächlich ein relativ gut verstecktes Flag das den gleichen Zweck erfüllt wie WaitForInputIdle
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)

Geändert von OldGrumpy (11. Mai 2011 um 10:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#8

AW: Externes programm starten und warten bis dieses "bereit" ist

  Alt 11. Mai 2011, 10:32
Stümmt ... Ich trinke garkeinen Kaffee

Nja, ansonsten kann man bei ShellExecuteEx über die HINSTANCE auf die Beendigung der Anwendung warten.
So wurde es zumintestens mal in dem CodeLib-Eintrag gemacht ....... damals im alten Forum.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#9

AW: Externes programm starten und warten bis dieses "bereit" ist

  Alt 11. Mai 2011, 11:06
Stümmt ... Ich trinke garkeinen Kaffee

Nja, ansonsten kann man bei ShellExecuteEx über die HINSTANCE auf die Beendigung der Anwendung warten.
Ja, aber es ging ja gar nicht um die Beendigung sondern nur darum zu warten bis die Anwendung komplett gestartet ist und "aufnahmebereit" wird
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#10

AW: Externes programm starten und warten bis dieses "bereit" ist

  Alt 11. Mai 2011, 11:26
Ja, aber es ging ja gar nicht um die Beendigung sondern nur darum zu warten bis die Anwendung komplett gestartet ist und "aufnahmebereit" wird
Das könnte man ja auch prüfen > über die HINSTANCE hat man den Prozess, darüber kann man die Hauptfenster suchen
und auf gewisse Eigenschaften hin prüfen > ist ein bestimmtes Fenster vorhanden, haben darin gewisse Elemente einen bestimmten status, werden Messages verarbeitet usw.

Wobei es erstmal etwas schwer wird zu definieren was "bereit" nun eigentlich ist
und welche Zustände man demnach prüfen müßte.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz