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); |
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. |
AW: Rausfinden wie oft ein Programm läuft
Zitat:
|
AW: Rausfinden wie oft ein Programm läuft
Du könntest folgendes Versuchen:
Delphi-Quellcode:
Man bemerke, dass das eine ziemlich fiese möglichkeit ist. Es geht bestimmt auch anders
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); PS: Den MessageDlg würde ich im initialization-Abschnitt nicht riskieren. lieber eine hübsche API-Funktion |
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. |
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:
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?
var
test :TJclAppInstances; begin test:=JvAppInstances1.AppInstances; end; Danke im voraus Edit: Ich habs gefunden. JvAppInstances1.AppInstances.InstanceCount Vielen dank für den stubs in die richtige richtung! |
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; |
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.... |
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:
Delphi-Quellcode:
oder vielleicht sogar sowas wie
JvAppInstances1.AppInstances.GetInstanceCount
Delphi-Quellcode:
JvAppInstances1.GetInstanceCount
|
AW: Rausfinden wie oft ein Programm läuft
Für diejenigen, die keine Komponente verwenden wollen, hier, eine Konsolenanwendung für Demozwecke:
Delphi-Quellcode:
Führe diese Konsolenanwendung einfach mehrmals hintereinander aus, ohne die vorherigen Instanzen zu schließen, um die Instanzenzählung zu sehen!
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. Have fun! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:42 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