Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Rausfinden wie oft ein Programm läuft (https://www.delphipraxis.net/158389-rausfinden-wie-oft-ein-programm-laeuft.html)

DelTurbo 15. Feb 2011 16:58

Rausfinden wie oft ein Programm läuft
 
Hi,

leider finde ich in google nix. Deshalb frage ich einfach mal. Ich möchte ein Programm mehrmals starten. Ich weiss wie ich rausfinde ob das programm schon läuft, aber leider nicht wie oft das schon läuft. Wär super wenn mir da mal jemand helfen könnte.

Vielen dank im voraus

Rausfinden ob das Programm schon läuft mache ich wie folgt.

Delphi-Quellcode:
      Initialization //Verhindern, dass das Programm mehrmals gestartet wird
          mHandle := CreateMutex(nil, True, 'Projekt1.exe');
              if GetLastError = ERROR_ALREADY_EXISTS then
              begin
           MessageDlg('Das Programm läuft schon!', mtWarning, [mbOK], 0);
                Halt;
              end;
      finalization
         if mHandle <> 0 then CloseHandle(mHandle);

himitsu 15. Feb 2011 17:13

AW: Rausfinden wie oft ein Programm läuft
 
Mutex = es kann nur Einen geben

Wenn es den Mutex also schon gibt, dann gibt es eine andere Anwendung, mit einem gleichnamigen Mutex im selben Kontext, in welchem man den neuen Mutex erstellen will.
> also geht hier nur "Einer oder Keiner"

Willst du die Anzahl wissen und mehrere zulassen, dann wirst du irgendwas nutzen müssen, welches ebenfalls global existiert und über eine Art Referenzzzählung verfügt.

DelTurbo 15. Feb 2011 17:22

AW: Rausfinden wie oft ein Programm läuft
 
Zitat:

Zitat von himitsu (Beitrag 1081929)
Willst du die Anzahl wissen und mehrere zulassen, dann wirst du irgendwas nutzen müssen, welches ebenfalls global existiert und über eine Art Referenzzzählung verfügt.

Das habe ich vor. Aber leider weiss ich nicht wie ich das anstellen soll. Das beispiel oben habe ich hauptsächlich drangehängt, falls mal jemand sowas sucht.

WM_CLOSE 15. Feb 2011 17:28

AW: Rausfinden wie oft ein Programm läuft
 
Du könntest folgendes Versuchen:
Delphi-Quellcode:
      var
        i:Integer=0;    
      Initialization //Zählen wie oft das Programm gestartet wird
          repeat
              mHandle := CreateMutex(nil, True, 'InstanzMeinerApplikation'+ IntToStr(i));
              Inc(i);
          until GetLastError <> ERROR_ALREADY_EXISTS;
          MessageBox(0, PChar('Das Programm wurde'+IntToStr(i)+'mal gestartet') , 'MeinProg', MB_OK)
      finalization
         if mHandle <> 0 then CloseHandle(mHandle);
Man bemerke, dass das eine ziemlich fiese möglichkeit ist. Es geht bestimmt auch anders

PS: Den MessageDlg würde ich im initialization-Abschnitt nicht riskieren. lieber eine hübsche API-Funktion

shmia 15. Feb 2011 17:31

AW: Rausfinden wie oft ein Programm läuft
 
In der JCL gibt es die Unit JclAppInst, mit der man die Anzahl der laufenden Instanzen zählen und auch begrenzen kann.
Ausserdem können die Instanzen untereinander auch Daten austauschen.
Das funktioniert sehr gut; nur auf einem Terminal Server klappt der Datenaustausch leider nicht.

Wenn du die JCL benützen magst, ist der Programmieraufwand sehr gering.

DelTurbo 15. Feb 2011 18:04

AW: Rausfinden wie oft ein Programm läuft
 
Erstmal danke für die antworten. Jcl hab ich natürlich drauf ;)

Soll das dann damit gehen: JvAppInstances1.AppInstances ?

Leider kommt ein fehler (unbekannt) wenn ich das bei var eintrage.

test :TJclAppInstances;

Ich dachte mir das so.....

Delphi-Quellcode:
var
   test :TJclAppInstances;
begin
   test:=JvAppInstances1.AppInstances;
end;
Was mach ich nun wieder falsch??? Ich dachte in TJclAppInstances steht dann z.b. ein Integer drinne der die anzahl der laufenden Programme hat. War das wieder zu einfach gedacht?

Danke im voraus

Edit: Ich habs gefunden. JvAppInstances1.AppInstances.InstanceCount

Vielen dank für den stubs in die richtige richtung!

DeddyH 15. Feb 2011 18:14

AW: Rausfinden wie oft ein Programm läuft
 
Nach einem kurzen Blick in die Unit sollte das so funktionieren:
Delphi-Quellcode:
var
  test: TJclAppInstances;
begin
  test := TJclAppInstances.Create;
  try
    ShowMessage(IntToStr(test.GetInstanceCount));
  finally
    test.Free;
  end;

DelTurbo 15. Feb 2011 18:24

AW: Rausfinden wie oft ein Programm läuft
 
Nein. Dort kommt dann "Undefinierter Bezeichner TJclAppInstances". Die Unit steht aber in uses drinne.

Mit JvAppInstances1.AppInstances.InstanceCount klappt es auch sehr gut. Ich merke mir den wert beim start des programms. Schon habe ich was ich wollte.

Nochmal danke....

himitsu 15. Feb 2011 18:44

AW: Rausfinden wie oft ein Programm läuft
 
Wenn JvAppInstances1 geht, dann hast du vermutlich ein TJvAppInstances auf die Form gezogen?
Wenn ja, dann braucht man es natürlich nich nochmal manuell zu instantiieren.

PS: Es gibt TJclAppInstances und auch eine TJvAppInstances, welcher vermutlich auch in unterschiedlichen Units rumgammeln (Jcl ist das nichtvisuelle Jedi-CL und Jv ist die visuelle JEDI-VCL)
Zitat:

TJvAppInstance encapsulates the TJclAppInstance class
Delphi-Quellcode:
JvAppInstances1.AppInstances.GetInstanceCount
oder vielleicht sogar sowas wie
Delphi-Quellcode:
JvAppInstances1.GetInstanceCount

Aphton 15. Feb 2011 21:00

AW: Rausfinden wie oft ein Programm läuft
 
Für diejenigen, die keine Komponente verwenden wollen, hier, eine Konsolenanwendung für Demozwecke:

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  Windows;

var
  hFile: THandle;
  Instances: Integer = 0;
  pData: PInteger;

const
  lpFilename: PChar = 'ProjFileSize';

begin
  hFile := OpenFileMapping( FILE_MAP_READ or FILE_MAP_WRITE, True, lpFilename );
  if hFile = ERROR then
    hFile := CreateFileMapping( INVALID_HANDLE_VALUE, NIL, PAGE_READWRITE, 0, 4, lpFilename );
  if hFile <> ERROR then
    try
      pData := MapViewOfFile( hFile, FILE_MAP_READ or FILE_MAP_WRITE, 0, 0, 4 );
      if Assigned( pData ) then
      begin
        try
          Instances := pData^;
          Writeln( Instances, ' instances have already been existing; increasing it...' );
          inc( Instances );
          pData^ := Instances;
          Writeln( 'Increased and updated!' );
          Write( 'Instances = ', Instances, ' (press return to enter the terminating-process)' );
          Readln;
          Instances := pData^;
          Writeln( 'Terminating... decreasing instances' );
          dec( Instances );
          Writeln( 'Instances = ', Instances );
          pData^ := Instances;
          Writeln( 'Decreased and updated!' );
        finally
          UnmapViewOfFile( pData );
        end;
        Write( 'Press any key to exit...' );
        Readln;
      end;
    finally
      CloseHandle( hFile );
    end;
end.
Führe diese Konsolenanwendung einfach mehrmals hintereinander aus, ohne die vorherigen Instanzen zu schließen, um die Instanzenzählung zu sehen!

Have fun!


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:42 Uhr.
Seite 1 von 3  1 23      

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