![]() |
Erkennen, falls Programm bereits aktiv
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 |
Re: Erkennen, falls Programm bereits aktiv
Zitat:
Grüße, Daniel |
genau das wäre am besten.
Gruß Hansa |
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. |
Zitat:
Code:
Und in der Unit, um Probleme mit dem Minimieren zu vermeiden:
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);
Code:
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.
[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]; |
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. |
Zitat:
|
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. |
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 |
Wenn es eine "Null-Aufwand"-Lösung sein soll, dann würde ich eben auf fertige Dinge zurückgreifen. Zum Beispiel
![]() Grüße, Daniel |
Habe die neuesten Antworten noch nicht gesehen. Es geht immer wieder um "Freigabe" oder so. Vergesst eins nicht : egal ob auf das Vorhandensein einer Datei oder sonst etwas reagiert werden soll, wird der Rechner einfach ABGESCHALTET, nützt kaum etwas.
Deshalb meine Idee mit der Tasknummer, die wird beim Windowsstart hoffentlich bei 0 oder 1 angefangen. Dann bräuchte ich keine Datei, Mutex, Semaphoren usw. 1. Task: gut. 2. Task 1. Task starten oder Fehlermeldung 3. und höhere Task können dann gar nicht entstehen wie bei Basic: if 2.Task goto 1.Task nur wie geht das??? bis demnächst Hansa |
Moin Hansa,
wenn Du Deine WS ID aus dem Computernamen und der Domain/Workgroup bildest, sollte sie eindeutig sein. Wenn Du jetzt den doppelten Start im Netz verhindern willst, kannst Du ja mit einer Datei arbeiten, die das Programm regelmässig Updaten muss, so dass man, wenn das Intervall überschritten wird, davon ausgehen kann, dass das Programm wohl nicht mehr läuft. Wenn die WS ID dann den Rechner identifiziert, könnte man ja sogar noch versuchen den Rechner auf Erreichbarkeit zu prüfen, um so genauer sicherzustellen, dass das Programm dort nicht mehr laufen kann. |
Vielleicht solltest Du Dich in der Tat mal mit dem Thema "Semaphoren" beschäftigen.
Stelle Sie Dir als kleine Signalflagge vor, die Windows auf Deine Anforderung hin in den Wind stellt. Sieht Deine Anwendung beim Start diese Flagge wehen, so kann sie direkt nach der bereits laufenden Instanz suchen und diese aktivieren. Schaltest Du den Rechner aus, so gehören die auf diesem Rechner laufenden Instanzen und Semaphoren (Flaggen) ebenfalls der Vergangenheit an. Arbeitest Du im Netzwerk, so kann Deine Anwendung auf jeder Workstation genau einmal (oder eine von Dir bestimmte Anzahl an Instanzen) gestartet werden. Eigentlich genau das, was Du suchst. Ein Beispiel hierzu findest Du beispielsweise bei ![]() ![]() Grüße, Daniel P.S. @Christian: Ich hatte es so verstanden, dass das Programm im Netzwerk durchaus mehrfach gestartet werden darf. Nur eben höchstens eine Instanz pro Workstation. |
Hallo Daniel,
du hast das schon richtig verstanden : von mir aus sollen 200 Leute mit dem Programm arbeiten aber immer nur mit einer Instanz. Der Thread hier läuft nicht mehr in die ursprüngliche Richtung, ich glaube mit den Flaggen (Semaphoren) hätte ich vor meinem Schlaumeier (bzw. bei Einzelplätzen)Ruhe. Der spielt halt gerne, wahrscheinlich vor allem mit den Systemeinstellungen und dem Dateisystem. Die Semaphoren scheinen das zu sein was ich suche. Jetzt suche ich diese :shock: und schau mir an wie das genau geht. Im Netzbetrieb stellen sich halt noch ganz andere Fragen. Die Sache mit der WS-Nr. stelle ich gesondert bei Rubrik Netzwerke. Glaube, daß das auch für andere interessant ist. Gruß Hansa |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz