AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Erkennen, falls Programm bereits aktiv
Thema durchsuchen
Ansicht
Themen-Optionen

Erkennen, falls Programm bereits aktiv

Ein Thema von Hansa · begonnen am 21. Aug 2002 · letzter Beitrag vom 21. Aug 2002
Antwort Antwort
Seite 1 von 2  1 2      
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#1

Erkennen, falls Programm bereits aktiv

  Alt 21. Aug 2002, 12:50
Hallo Leute,

wie kann ich am einfachsten ermitteln, ob mein Programm bereits läuft?

Ein ganz Schlauer legt Wert auf seinen Bildschirmschoner. Wird der aktiv, so "fällt" mein Programm in die Taskleiste und er sieht das nicht. Dann startet er es am Tag mehrmals, bis es irgendwann abstürzt.

Am besten wäre es, wenn direkt beim Anklicken eine Fehlermeldung käme.
Eigentlich brauche ich ja nur zu überprüfen, ob die EXE Datei geöffnet ist. Aber wie?

Gruß
Hansa
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Erkennen, falls Programm bereits aktiv

  Alt 21. Aug 2002, 12:55
Zitat von Hansa:
Am besten wäre es, wenn direkt beim Anklicken eine Fehlermeldung käme.
Du könntest überlegen, alternativ gleich zur laufenden Instanz Deiner Anwendung zu wechseln.


Grüße,
Daniel
Daniel R. Wolf
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#3
  Alt 21. Aug 2002, 12:59
genau das wäre am besten.

Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#4
  Alt 21. Aug 2002, 13:08
Hai Hansa,

ich habe das einfach über einen Mutex gelöst:

Code:
var
 mHandle           : THandle;

begin
 mHandle := CreateMutex(nil, True, '{13971189-D133-4D62-9510-AF8EACD8E366}');
 if GetLastError = ERROR_ALREADY_EXISTS then
  begin
   ShowMessage('Die Anwendung wird bereits ausgeführt!');
   if mHandle <> 0 then
    CloseHandle(mHandle)
  end
 else
  begin
   Application.Initialize;
  end;
end.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#5
  Alt 21. Aug 2002, 13:19
Zitat von Sharky:
ich habe das einfach über einen Mutex gelöst:
... und dabei aber vergessen, den Mutex am Ende mit "CloseHandle" oder "ReleaseMutex" freizugeben. Ein besserer Weg wäre daher dieser, weil er die alte Instanz in den Vordergrund holt:
Code:
mHandle := CreateMutex([b]nil[/b], True, '{13971189-D133-4D62-9510-AF8EACD8E366}');

[b]if[/b] GetLastError = ERROR_ALREADY_EXISTS [b]then[/b]
  [b]begin[/b]
    [color=#000080][i]// Name "TDeineForm" richtet sich nach dem Namen deiner Form! :o) -->[/i][/color]
    SendMessage(findwindow('TDeineForm',[b]nil[/b]),WM_SYSCOMMAND,SC_RESTORE,0);
    SetForegroundWindow(findwindow('TDeineForm',[b]nil[/b]));
  [b]end[/b]
[b]else[/b]
  [b]begin[/b]
    [color=#000080][i]// bla bla[/i][/color]
  [b]end[/b];

ReleaseMutex(mHandle);
Und in der Unit, um Probleme mit dem Minimieren zu vermeiden:
Code:
[b]type[/b]
  TDeineForm = [b]class[/b](TForm)
    ...
  [b]private[/b]
    [b]procedure[/b] WmSysCommand([b]var[/b] [b]Message[/b]: TMessage); [b]message[/b] WM_SYSCOMMAND;
  ...
  [b]end[/b];

[b]procedure[/b] TDeineForm.WmSysCommand([b]var[/b] [b]Message[/b]: TMessage);
[b]begin[/b]
  [b]if[/b]([b]Message[/b].Msg = WM_SYSCOMMAND) [b]and[/b] ([b]Message[/b].wParam = SC_RESTORE) [b]then[/b]
    Application.Restore;
  [b]inherited[/b];
[b]end[/b];
Im Entwickler-Forum gibt´s irgendwo noch eine Diskussion über "Semaphore", mit denen man auch festlegen kann, dass z.B. die Anwendung zweimal gleichzeitig aktiv sein kann. Jeder Startversuch darüber hinaus wird geblockt. Auch ein interessanter Ansatz.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 21. Aug 2002, 15:02
Moin Mathias,

wobei im EF dann auch noch darauf hingewiesen wurde, dass ein Mutex den Nachteil gegenüber einer Semaphore hat, dass er nicht, bei Absturz des Programmes, automatisch wieder freigegeben wird.
Schmiert das Programm ab, kann es gut sein, dass es sich erst nach Reboot wieder starten lässt.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#7
  Alt 21. Aug 2002, 15:36
Zitat von Christian Seehase:
Moin Mathias,

wobei im EF dann auch noch darauf hingewiesen wurde, dass ein Mutex den Nachteil gegenüber einer Semaphore hat, dass er nicht, bei Absturz des Programmes, automatisch wieder freigegeben wird.
Schmiert das Programm ab, kann es gut sein, dass es sich erst nach Reboot wieder starten lässt.
Hmmm.... ist mir noch nie passiert! Und mein Programm stürzt alle 5 Minuten ab (Aber nur werend ich eine neue Funktion teste)
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#8
  Alt 21. Aug 2002, 15:44
Moin Sharky,

wenn das Programm abstürtzt, so dass es aber noch durch die Freigabe des Mutex Handles läuft, ist ja alles gut.
Wenn es allerdings über den Taskmanager abgeschossen wird, oder sonstwie durch TerminateProcess, dürfte das mit der Freigabe daneben gehen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#9
  Alt 21. Aug 2002, 16:15
Hallo,

wie immer beim Programmieren gilt es, den richtigen Mittelweg zu finden, ohne zu viel Aufwand. Am einfachsten wäre es wirklich, beim Programmstart eine Datei zu erzeugen, die beim Programmende wieder gelöscht wird.

Da hat aber Chris Seehase Recht, da wie hier durch einen unkundigen Anwender und einen fast schon erzwungenen Absturz die Datei ja immer noch da wäre.

Dann käme die Meldung "Programm bereits gestartet", was ja nicht der Fall ist! Semaphoren sagen mir ehrlich gesagt im Moment nichts. Guck ich mir mal an.

Aber noch wichtiger : was ist im Netzwerkbetrieb? Der zweite User bekäme automatisch immer die Meldung! Das Problem ist zwar einfach zu beheben indem der Dateiname mit der Workstationnr. verknüpft wird.

Da geht es aber schon wieder los. Setze Novell ein, kein Problem. Wenn jemand weiß, wo ich unter Windows eine eindeutige WS-Nr. herkriege : bitte melden. Habe das im DF schon gefragt, aber kurz vor Schluß.
Für sämtliche Betriebs- und Netzwerk-Konstellationen bräuchte ich am besten eine WS-Nr. und dazu noch eine Tasknr. Dann wäre als Dateiname z.B. 001001 WS 1 Task 1 und 001002 WS1 Task 2. Der wäre schon zuviel und müßte die Meldung bringen. Die zusammengesetzten Nummern müßte ich dann halt auseinanderpflücken oder so. Aber es wird doch für dieses Thema zu kompliziert. Ich merke nämlich wo ich das hier schreibe, daß ich um diese Nummern nicht herumkomme (auch für wichtigere Sachen). Also sage ich meinem Heini, er solle die Taskleiste beachten. Basta.
Oder diese Semaphoren ??? Mal sehen. Mache einen neuen thread mit WS und Tasknummern auf. Habe in keinem Forum etwas in dieser Richtung gefunden.

Die Tasknummern sind aber auch beim Einzelplatz von Bedeutung!

Danke für die Hilfe
hansa
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#10
  Alt 21. Aug 2002, 16:22
Wenn es eine "Null-Aufwand"-Lösung sein soll, dann würde ich eben auf fertige Dinge zurückgreifen. Zum Beispiel Torry hat einiges zu diesem Thema.


Grüße,
Daniel
Daniel R. Wolf
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:38 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