Willkommen bei Entwickler-Forum.
Ergebnis 1 bis 5 von 5
  1. #1
    Aufsteiger
    Registriert seit
    23.03.2007
    Beiträge
    64

    Standard Fremden Prozess starten und nicht warten

    Hallo beisammen,

    ich habe ein Problem mit der Systemanzeige des Cursors (Sanduhr).
    Und zwar möchte ich ein externes Programm (ohne Oberfläche als Service erstellt) starten und fertig.
    Also nicht warten auf feedback (Message).

    Egal was ich einstelle, ich bekommen immer die Sanduhr (CD) zu sehen. Kann mir jemand einen Tip geben?

    Das ist mein Code:
    Code:
    procedure TFMain.RunProcessBC(PStr : string);
    var
      FName: string;
      StartInfo: TStartupInfo;
      ProcInfo: TProcessInformation;
      Priority: Integer;
    begin
      FillChar(StartInfo,SizeOf(TStartupInfo),#0);
      FillChar(ProcInfo,SizeOf(TProcessInformation),#0);
      StartInfo.cb := SizeOf(TStartupInfo);
      fname := extractfiledir(paramstr(0))+'\myfilehere.exe '+PStr;
      // priority über Ini- Datei gesteuert
      UniqueString(fname);
      try
        CreateProcess(nil, PChar(FName), nil, nil,False,
                              DETACHED_PROCESS + Priority,
                              nil, nil, StartInfo, ProcInfo);
      finally
        CloseHandle(ProcInfo.hProcess);
        CloseHandle(ProcInfo.hThread);
      end;
    end;
    Das aufgerufene Programm wird ebenfalls ein anderes Programm aufrufen mit gleicher Routine.
    Kommentiere ich den Aufruf aus, so ist keine Sanduhr zu sehen, es liegt also am CreateProcess. Der Service hat keine Oberfläche.

    Compiler: Delphi XE7
    Betriebssysteme Win7 oder höher, Serverversionen

    Danke euch und Gruß

    Peter

  2. #2
    Forenheld
    Registriert seit
    26.02.2003
    Beiträge
    16.301

    Standard

    Klasse ServiceController nutzen. Ein Service ist kein Process.

    https://msdn.microsoft.com/de-de/lib...v=vs.110).aspx
    Christian

  3. #3
    Aufsteiger
    Registriert seit
    23.03.2007
    Beiträge
    64

    Standard

    Werde ich versuchen, vielen Dank erst einmal.
    Ich melde mich morgen.

    Gruß

    Peter

  4. #4
    Aufsteiger
    Registriert seit
    23.03.2007
    Beiträge
    64

    Standard

    Guten Morgen,

    mir scheint, ich bin das irgendwie falsch angegangen. Hier also noch einmal etwas detaillierter:
    Ich habe verschiedene Berechnungen und wiederkehrende Aufgaben aus meinem Quellcode in eigene Dienste ausgelagert.
    Der Hauptdienst läuft auf dem Server und importiert/Exportiert Daten aus einer Datenbank und erzeugt Backups nach Vorgabe.
    Dieser läuft unabhängig und selbständig, also immer.
    Weiterhin werden verschiedenen Berechnungen in Dienste ausgelagert, welche nur bei Bedarf gestartet werden. Das geschieht, wie oben gezeigt. Diese "Dienste" arbeiten Ihre Aufgaben ab,
    erzeugen teilweise einen neuen Dienst welcher Berechnungen auf der Basis der vorherigen Ergebnisse erzeugt und beenden sich dann wieder.

    Auf dem Server läuft das alles wie es soll, keine Useranmeldung notwendig, keine Beeinträchtigungen bei eine Anmeldung.

    Auf den Clients werden die zeitweise benötigten Dienste (also die Berechnungen) ebenso wie oben von einem Programm mit UI aufgerufen. Die Funktionalitität ist ebenfalls korrekt, nur das Feedback mit der Sanduhr stört.
    Der Einfachheit halber habe ich die Dienste für den Client übernommen. Kann es sein, dass ich hier diese als Consolenprogramme umbauen sollte? Läuft das dann auch dem Server so korrekt weiter, weil ich möchte ungern die Quellen zweimal pflegen.

    Ganz wichtig: die Dienste werden mit Parameter gestartet und es können mehrere parallel und unabhängig von einander laufen.

    Gruß

    Peter
    Geändert von petermaennchen (09.03.2018 um 09:20 Uhr)

  5. #5
    Aufsteiger
    Registriert seit
    23.03.2007
    Beiträge
    64

    Standard

    Nach vielen Irrwegen habe ich jetzt eine Lösung gefunden:

    Mißstand
    Die Anwendungen aus einem GUI heraus gestartet, egal ob als Service oder als Prozess, verbrauchen reichlich CPU- Zeit. Es kommt zu genannten Eieruhr.

    Wege
    Ich hatte, um die Idee von Christian aufzugreifen, die Services in Anwendungen ohne Oberfläche umgebaut.
    Aufrufe:
    - createprocess,
    - shellexecute und
    - createprocessasUser

    (Teil)Lösung
    Nachdem ich nicht zum Erfolg kam (Immer die Eieruhr bis die letzte Instanz beendet wurde), habe ich im CreateEreignis der jeweiligen Instanz ein processmessages eingebaut.
    Jetzt blitzt die Eieruhr einmal kurz auf, das war's. Noch nicht ganz das, was ich mir wünsche, aber erträglich.
    Eventuell könnte ich im Programm/Service eine Message absetzen an die erzeugende Instanz um die Eieruhr ganz loszuwerden.

    Gruß

    Peter
    Geändert von petermaennchen (09.03.2018 um 13:42 Uhr)

 

 

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •