AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Rausfinden wie oft ein Programm läuft
Thema durchsuchen
Ansicht
Themen-Optionen

Rausfinden wie oft ein Programm läuft

Ein Thema von DelTurbo · begonnen am 15. Feb 2011 · letzter Beitrag vom 11. Dez 2011
Antwort Antwort
Seite 1 von 3  1 23      
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.194 Beiträge
 
Delphi 2007 Architect
 
#1

Rausfinden wie oft ein Programm läuft

  Alt 15. Feb 2011, 16:58
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);
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Rausfinden wie oft ein Programm läuft

  Alt 15. Feb 2011, 17:13
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.194 Beiträge
 
Delphi 2007 Architect
 
#3

AW: Rausfinden wie oft ein Programm läuft

  Alt 15. Feb 2011, 17:22
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.
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#4

AW: Rausfinden wie oft ein Programm läuft

  Alt 15. Feb 2011, 17:28
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

Geändert von WM_CLOSE (15. Feb 2011 um 17:31 Uhr)
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

AW: Rausfinden wie oft ein Programm läuft

  Alt 15. Feb 2011, 17:31
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.
Andreas
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.194 Beiträge
 
Delphi 2007 Architect
 
#6

AW: Rausfinden wie oft ein Programm läuft

  Alt 15. Feb 2011, 18:04
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!
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!

Geändert von DelTurbo (15. Feb 2011 um 18:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Rausfinden wie oft ein Programm läuft

  Alt 15. Feb 2011, 18:14
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.194 Beiträge
 
Delphi 2007 Architect
 
#8

AW: Rausfinden wie oft ein Programm läuft

  Alt 15. Feb 2011, 18:24
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....
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Rausfinden wie oft ein Programm läuft

  Alt 15. Feb 2011, 18:44
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
JvAppInstances1.AppInstances.GetInstanceCount oder vielleicht sogar sowas wie JvAppInstances1.GetInstanceCount
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (15. Feb 2011 um 18:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#10

AW: Rausfinden wie oft ein Programm läuft

  Alt 15. Feb 2011, 21:00
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!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 10:50 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