Announcement

Collapse
No announcement yet.

Fremden Prozess starten und nicht warten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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
    Klasse ServiceController nutzen. Ein Service ist kein Process.

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

    Comment


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

      Gruß

      Peter

      Comment


      • #4
        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
        Zuletzt editiert von petermaennchen; 09.03.2018, 10:20.

        Comment


        • #5
          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
          Zuletzt editiert von petermaennchen; 09.03.2018, 14:42.

          Comment

          Working...
          X