Wird Progamm bereits verwendet ?
Moderator: Moderatoren
-
- Rekursionen-Architekt
- Beiträge: 153
- Registriert: Do, 06. Apr 2006 10:51
- Danksagung erhalten: 3 Mal
Wird Progamm bereits verwendet ?
Hallo Wissende,
in einer Netzwerkumgebenung (2 - 3 PC nutzen ein gemeinsames freigegebenes Progammverzeichnis) soll ermittelt werden,
ob das Programm bereits auf einer Station läuft .
Hintergrund: Nur der PC, der als erstes das Programm aufruft soll bestimmte zusätzliche Startroutinen durchlaufen.
Wer kann mir da ein paar Tips geben, oder wie kann sowas gelöst werden ?
Grüße von
Peter
in einer Netzwerkumgebenung (2 - 3 PC nutzen ein gemeinsames freigegebenes Progammverzeichnis) soll ermittelt werden,
ob das Programm bereits auf einer Station läuft .
Hintergrund: Nur der PC, der als erstes das Programm aufruft soll bestimmte zusätzliche Startroutinen durchlaufen.
Wer kann mir da ein paar Tips geben, oder wie kann sowas gelöst werden ?
Grüße von
Peter
Gruss Peter
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Wird Progamm bereits verwendet ?
Hallo Peter,
diese Diskussion hatten wir hier schon mehrfach. Es gab da verschiedene Lösungsansätze. Aber wenn Du nach mutex suchst, soltlst Du alles finden können.
Jan
diese Diskussion hatten wir hier schon mehrfach. Es gab da verschiedene Lösungsansätze. Aber wenn Du nach mutex suchst, soltlst Du alles finden können.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
-
- Rekursionen-Architekt
- Beiträge: 118
- Registriert: Mi, 28. Nov 2007 12:48
- Wohnort: Wien
- Hat sich bedankt: 5 Mal
- Kontaktdaten:
Re: Wird Progamm bereits verwendet ?
Mutex bringt doch nur etwas um festzustellen, ob auf einem PC das Programm bereits läuft. Im Netzwerk ist das IMHO nicht verwendbar.Jan hat geschrieben:Aber wenn Du nach mutex suchst, soltlst Du alles finden können.
Lösungsansatz: Beim Start die Existenz einer Log-Datei abfragen und dann, wenn nicht vorhanden diese Log-Datei im EXE-Verzeichnis erstellen. Wenn die nicht vorhanden ist, ist das Programm das erste Mal gestartet, wenn vorhanden, ist man nicht der Erststarter.
Gruß aus Wien
Leon
Leon
- HaPe
- 1000 working lines a day
- Beiträge: 996
- Registriert: So, 15. Nov 2015 17:44
- Wohnort: 71665 Vaihingen-Enz
- Hat sich bedankt: 17 Mal
- Danksagung erhalten: 15 Mal
Re: Wird Progamm bereits verwendet ?
Hallo Zusammen !
[Defaults]
AuditTrail=0
[ToDo]
SERVER=NOTHING
IVK240=NOTHING
IVKPCY=NOTHING
Unter ToDo werden vom Admin alle "berechtigten" PCs ein getragen.
Beim Start des Programmes auf einer Arbeitsstation, trägt diese hinter seinem Namen den Text "RUNNING" ein.
Wenn also kein RUNNING gefunden wird, hat man das Programm als erstes gestartet.
Einen kleinen "Haken" hat diese Vorgehensweise. Wenn das Programm abstürzt, steht da immer noch RUNNING drin.
Dafür kann ein Admin durch Eintrag von QUIT hinter dem PC-Namen bestimmte oder alle Anwender aus dem Programm "Werfen" (AutoQuit), zb. wenn Wartungsarbeiten anstehen.
Das Programm prüft regelmäßig diesen Eintrag und kann dann reagieren.
Ich habe auf dem Netz wo die Daten liegen eine Start.ini mit folgendem Inhalt:in einer Netzwerkumgebenung (2 - 3 PC nutzen ein gemeinsames freigegebenes Progammverzeichnis) soll ermittelt werden,
ob das Programm bereits auf einer Station läuft.
[Defaults]
AuditTrail=0
[ToDo]
SERVER=NOTHING
IVK240=NOTHING
IVKPCY=NOTHING
Unter ToDo werden vom Admin alle "berechtigten" PCs ein getragen.
Beim Start des Programmes auf einer Arbeitsstation, trägt diese hinter seinem Namen den Text "RUNNING" ein.
Wenn also kein RUNNING gefunden wird, hat man das Programm als erstes gestartet.
Einen kleinen "Haken" hat diese Vorgehensweise. Wenn das Programm abstürzt, steht da immer noch RUNNING drin.
Dafür kann ein Admin durch Eintrag von QUIT hinter dem PC-Namen bestimmte oder alle Anwender aus dem Programm "Werfen" (AutoQuit), zb. wenn Wartungsarbeiten anstehen.
Das Programm prüft regelmäßig diesen Eintrag und kann dann reagieren.
--
Hans-Peter
Hans-Peter
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 105 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Wird Progamm bereits verwendet ?
In einer Tabelle gibt es für jeden Benutzer (Computername aus dem Environment, ggf. Mac-Adresse oder IP) einen Datensatz. In einem Hintergrundthread wird diese Tabelle geöffnet und genau dieser Datensatz gesperrt. Alle x Minuten erfolgt aus Sicherheitsgründen (Netzwerktimeouts) ein kurzes Unlock und gleich wieder die Sperrung (der Thread bleibt in dieser Schleife, die Latenz liegt im Millisekundenbereich). Wenn sich diese Tabelle nicht exklusiv öffnen lässt, ist irgendwer aktiv, und anhand der gesperrten (also nicht mehr sperrbaren) Sätze kann man sogar sagen, wer das ist. Beim Programmende wird die Sperrung aufgehoben, aber das ist eigentlich nicht erforderlich (außer: ADS). Und auch bei einem Absturz ist sie weg.
Zusätzlich gibt es bei uns noch eine Funktionalität, über die ein Admin die Programmbeendigung an allen Arbeitsplätzen auslösen kann. Das funktioniert über eine propreitäre Semaphorendatei, deren Existenz und Inhalt auch regelmäßig im Hintergrund geprüft wird. Der Admin kann eine Latenz festlegen. Die Benutzer sehen dann einen Hinweis, wie lange sie noch Zeit haben, um die Arbeit zu beenden (und warum der Abschluss ausgelöst wurde, etwa "Wartung"). Tun sie das nicht in der fraglichen Zeit, beendet sich das Programm selbsttätig.
Funktioniert beides einwandfrei und in allen Topologien sehr verlässlich.
Edit: Und das Fehlersystem berücksichtigt diese Systematiken natürlich auch.
Zusätzlich gibt es bei uns noch eine Funktionalität, über die ein Admin die Programmbeendigung an allen Arbeitsplätzen auslösen kann. Das funktioniert über eine propreitäre Semaphorendatei, deren Existenz und Inhalt auch regelmäßig im Hintergrund geprüft wird. Der Admin kann eine Latenz festlegen. Die Benutzer sehen dann einen Hinweis, wie lange sie noch Zeit haben, um die Arbeit zu beenden (und warum der Abschluss ausgelöst wurde, etwa "Wartung"). Tun sie das nicht in der fraglichen Zeit, beendet sich das Programm selbsttätig.
Funktioniert beides einwandfrei und in allen Topologien sehr verlässlich.
Edit: Und das Fehlersystem berücksichtigt diese Systematiken natürlich auch.
Herzlich,
Tom
Tom
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2950
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 14 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Wird Progamm bereits verwendet ?
Und wer das nicht mit einer Datenbank lösen möchte, der kann folgendes machen:
Bei Start des Programms alle *.login-Dateien löschen, dann mit FCreate() eine Datei USERxxx.login erzeugen und offen lassen.
Am Ende des Programms Datei USERxxx.login schließen und löschen.
Bevor eine exclusicve Aktion durchgeführt werden muss, kann man also immer probieren, alle *.login - Dateien zu löschen, ist nach dem Löschen noch eine vorhanden, so ist noch jemand im Programm.
Auch beim Absturz eines Programms wird die Datei Freigegeben, so dass sie dann gelöscht werden kann.
Bei Start des Programms alle *.login-Dateien löschen, dann mit FCreate() eine Datei USERxxx.login erzeugen und offen lassen.
Am Ende des Programms Datei USERxxx.login schließen und löschen.
Bevor eine exclusicve Aktion durchgeführt werden muss, kann man also immer probieren, alle *.login - Dateien zu löschen, ist nach dem Löschen noch eine vorhanden, so ist noch jemand im Programm.
Auch beim Absturz eines Programms wird die Datei Freigegeben, so dass sie dann gelöscht werden kann.
Viele Grüße
Wolfgang
Wolfgang
-
- 1000 working lines a day
- Beiträge: 525
- Registriert: Mi, 01. Feb 2006 16:22
- Wohnort: 06618 Naumburg
Re: Wird Progamm bereits verwendet ?
Ich mache das mit einer recht einfachen Routine:
Mein Programm versucht, beim Start eine bestimmte DBF exclusiv zu öffnen.
Wenn das möglich ist, dann greift noch kein anderer zu und die Datei wird shared geöffnet - das war`s.
Mein Programm versucht, beim Start eine bestimmte DBF exclusiv zu öffnen.
Wenn das möglich ist, dann greift noch kein anderer zu und die Datei wird shared geöffnet - das war`s.
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Wird Progamm bereits verwendet ?
die Idee mit dem exclusiven Zugriff auf eine DBF hat ein Schönheitsfehler : was macht ihr wenn der 1st User seinen PC anlässt und in der Urlaub fährt ...
ich öffne ebenfalls eine DBF wo ich ein Feld Datum habe. der 1st User stellt das Datum auf aktuelle und erledigt die Aufgabe.
ich öffne ebenfalls eine DBF wo ich ein Feld Datum habe. der 1st User stellt das Datum auf aktuelle und erledigt die Aufgabe.
gruss by OHR
Jimmy
Jimmy
-
- Rekursionen-Architekt
- Beiträge: 153
- Registriert: Do, 06. Apr 2006 10:51
- Danksagung erhalten: 3 Mal
Re: Wird Progamm bereits verwendet ?
Hallo Wissende,
vielen Dank für Eure Tips und Vorschläge.
Der für mich einfachste Weg wird wohl in einer kombination der Vorschläge von HaPe und Jimmy liegen.
Nochmals Danke
Peter
vielen Dank für Eure Tips und Vorschläge.
Der für mich einfachste Weg wird wohl in einer kombination der Vorschläge von HaPe und Jimmy liegen.
Nochmals Danke
Peter
Gruss Peter
- Rudolf
- Programmier-Gott
- Beiträge: 1418
- Registriert: Mo, 02. Jan 2006 23:03
- Wohnort: Salzburg/Österreich
- Kontaktdaten:
Re: Wird Progamm bereits verwendet ?
Hello,
this ist the way I do it, I also create a XPF file for a user, so that it is not easy to login twice.
regard
Rudolf
this ist the way I do it, I also create a XPF file for a user, so that it is not easy to login twice.
regard
Rudolf
Code: Alles auswählen
FUNCTION makeappfile(nMod)
******************************************************************
local cFile := exename() + ".XUF"
static nUsrHnd
DEFAULT nUsrHnd to -1
DEFAULT nMod to 0
if nMod = 1 // close file
if nUsrHnd > 0
FCLOSE(nUsrHnd)
endif
return .t.
endif
if nUsrHnd = -1 // first Login
else
if nUsrHnd > 0
FCLOSE(nUsrHnd)
endif
endif
IF (nUsrHnd := FCREATE( cFile )) == -1 // Exist
dc_msgbox("The system " + exename() + " is already running !!!, start cancelled", , , , ,3)
return .f.
endif
FWRITE(nUsrHnd, cFile )
FCLOSE(nUsrHnd)
IF (nUsrHnd := FOPEN( cFile ,32)) == -1 // no write
*dc_msgbox("appstart error") // Should not happen
**FCLOSE(nUsrHnd)
*return .f.
ENDIF
return .t.
FUNCTION checkrunning(cExe)
******************************************************************
local cFile
local nUsrHnd
cFile := cExe + ".exe.XUF"
IF (nUsrHnd := FCREATE( cFile )) == -1 // Exist
return .t.
endif
FCLOSE(nUsrHnd)
filedelete(cFile)
return .f.
Rudolf Reinthaler
http://www.formcommander.net
http://www.formcommander.net
- Herbert
- Der Entwickler von "Deep Thought"
- Beiträge: 1991
- Registriert: Do, 14. Aug 2008 0:22
- Wohnort: Gmunden am Traunsee, Österreich
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Wird Progamm bereits verwendet ?
Peter, die Lösungen sind technisch gesehen da - aber dein Problem ist eventuell noch nicht gelöst...Peter Schweizer hat geschrieben:Nur der PC, der als erstes das Programm aufruft soll bestimmte zusätzliche Startroutinen durchlaufen.
Du musst noch prüfen, ob deine Startroutinen erfolgreich durchlaufen sind. Das wirst wohl bereits machen. Die Frage ist, wie viel zeit diese zusätzlichen Aufgaben brauchen. Währenddessen dürfte sich wohl niemand anderes einloggen...
So nebenbei wäre dies ein Job, der ausserhalb laufen müsste, unabhängig eines Login (Trigger).
Grüsse Herbert
Immer in Bewegung...
Immer in Bewegung...