Wird Progamm bereits verwendet ?

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Peter Schweizer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 153
Registriert: Do, 06. Apr 2006 10:51
Danksagung erhalten: 3 Mal

Wird Progamm bereits verwendet ?

Beitrag von Peter Schweizer »

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
Gruss Peter
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
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 ?

Beitrag von Jan »

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Leon
Rekursionen-Architekt
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 ?

Beitrag von Leon »

Jan hat geschrieben:Aber wenn Du nach mutex suchst, soltlst Du alles finden können.
Mutex bringt doch nur etwas um festzustellen, ob auf einem PC das Programm bereits läuft. Im Netzwerk ist das IMHO nicht verwendbar.

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
Benutzeravatar
HaPe
1000 working lines a day
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 ?

Beitrag von HaPe »

Hallo Zusammen !
in einer Netzwerkumgebenung (2 - 3 PC nutzen ein gemeinsames freigegebenes Progammverzeichnis) soll ermittelt werden,
ob das Programm bereits auf einer Station läuft.
Ich habe auf dem Netz wo die Daten liegen eine Start.ini mit folgendem Inhalt:
[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
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9357
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Wird Progamm bereits verwendet ?

Beitrag von Tom »

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.
Herzlich,
Tom
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2934
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Wird Progamm bereits verwendet ?

Beitrag von Wolfgang Ciriack »

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.
Viele Grüße
Wolfgang
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: Wird Progamm bereits verwendet ?

Beitrag von peternmb »

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.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Wird Progamm bereits verwendet ?

Beitrag von AUGE_OHR »

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.
gruss by OHR
Jimmy
Peter Schweizer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 153
Registriert: Do, 06. Apr 2006 10:51
Danksagung erhalten: 3 Mal

Re: Wird Progamm bereits verwendet ?

Beitrag von Peter Schweizer »

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
Gruss Peter
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Wird Progamm bereits verwendet ?

Beitrag von Rudolf »

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

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.

Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
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 ?

Beitrag von Herbert »

Peter Schweizer hat geschrieben:Nur der PC, der als erstes das Programm aufruft soll bestimmte zusätzliche Startroutinen durchlaufen.
Peter, die Lösungen sind technisch gesehen da - aber dein Problem ist eventuell noch nicht gelöst...
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...
Antworten