Programm bereits in Verwendung!

Blackhawk50000

Erfahrenes Mitglied
Programm bereits in Verwendung. Genau das soll irgendwie herrausgefunden werden.
Ich habe noch rein garkeine Ahnung wie ich das anstellen soll. Aber Fakt ist:
Es gibt mehrere Möglichkeiten da es EIN Server gibt (mit netzlaufwerken) und mehrere clientrechner. aber es oll immer nur EINER das Programm gleichzeitig benutzen können.

da ich mein programm recht einfach halten möchte und wenns nicht UNBEDINGT nötig ist, ne webserveice oder sowas ähnlichen vermeiden will, frage ich nun hier wie mach ichs am bessten.

möglichkeit eins:
Das programm ist so wie es ist auf dem netzlaufwerk zu finden und mehrere user greifen darauf zu. sollte es aber schon in benutzung sein, kommt ne messegebox "Programm bereits in benutzung".

möglichkeit zwei:
Das programm wird auf den clientrechner installiert und nur die datenbank ist auf dem server. und auch hier soll immer nur einer das programm benutzen können.


das problem ist, ich weiß nicht, wie ich da ran gehen soll.
es wäre cool, wenn ihr mir n vorschlag machen könnt, wie ich das problem so schnell wie möglich lösen kann.
 
Ich bin mir jetzt nicht sicher ob das so das richtige ist was du suchst und ob es in der richtung funktioniert, aber
versuch es dochmal mit den Boardmitteln von Windows.

Also bei der Netzwerkfreigabe generell nur 1 User zulassen, wenn der halt dadrauf ist, kann er das Programm ausführen. Wenn ein zweiter darauf will, sollte er eine Windows-Fehlermeldung kriegen, das er nicht auf die Netzwerkfreigabe zugreifen kann. Geht der 1. User aus der Verbindung raus, ist die Netzwerkfreigabe wieder frei.
 
@Alfons2: Dann wird das Programm aber schon blockiert, sobald ein User einen Explorer offen hat, in dem die Exe aufgelistet wird - d.h. das Programm wäre blockiert, obwohl es nicht verwendet wird. Oder?

@Blackhawk50000: Ich weiß nicht so recht. Warum brauchst du diese Einschränkung?
 
Hallo,

eine Möglichkeit:
Eine Art "Lockfiles", der grobe Ablauf wäre wie folgt:

Benutzer öffnet Programm, dieses erstellt eine versteckte Datei auf der Netzwerkfreigabe. In diese schreibt er periodisch (z.B.: Jede Minute) die aktuelle Zeit rein. Beim Beenden des Programms wird die Datei gelöscht.
Wenn ein anderer Benutzer das Programm öffnen will, erkennt dieses dass die versteckte Datei da ist und liest die eingetragene Zeit aus. Wenn diese länger als (z.B.) 5 Minuten in der Vergangenheit liegt, wird die Datei ignoriert und das Programm normal aufgemacht.
Die 5 Minuten sind eigentlich beliebig wählbar, sollte jedoch "human" sein. Stell dir vor das Programm stürzt ab und die Datei bleibt da und der Benutzer muss eine Stunde warten bis er wieder darf ;)

Eine andere Möglichkeit:
Du hast einen Server der auf Port XXX hört. Auf diesen kann sich nur ein Client verbinden. Der erste Client kriegt die Verbindung und lässt diese einfach offen. Ein weiterer Client bekommt keine Verbindung und somit eine Fehlermeldung. Sobald das Programm auf dem Client A geschlossen wird, wird auch die Verbindung getrennt.

Oder noch eine Andere: Mein persönlicher Favorit
Jede Instanz des Programms öffnet einen Socket auf einer Multicastadresse (z.B.: 224.123.4.5). Beim Start des Programms wird ein Paket an die Adresse gesendet. Falls schon ein Programm läuft, antwortet es auf das Paket. Das neu gestartete Programm empfängt das Paket und zeigt eine Fehlermeldung an. Voraussetzung hierbei ist jedoch, dass sich alle Rechner im selben Netz befinden, ein Multicast wird nicht über einen Router versendet.

Genau wie meinem Vorredner Shakie eröffnet sich mir nicht der Sinn des Ganzen. Wenn du eine Datenbank verwendest und konkurrierende Zugriffe vermeiden willst, würden sich Locks auf Datenbankebene anbieten.

Gruß
BK
 
@Shaki, stimmt das ist war, habe ich nicht dran gedacht.

Was ich einmal gemacht habe, ist eine Art Chatprogramm per WinSockets.
Ein Clientprogramm auf meinem rechner und auf einem anderen Rechner hatte ich das Server Programm stehen. Wenn du dein Clientprogramm mit dem server verbunden hast, konntest du halt mit ihm schreiben (und er hat sogar nach meiner Programmierung geantwortet :D ) Jedenfalls, wenn du dann ein zweites Programm an den Server binden wolltest, hast du eine Fehlermeldung bekommen, Es wird bereits gechattet.

Aber wie gesagt, hängt davon ab in wie fern sich das für dein Programm realisieren lässt, was du damit vor hast.

Kann sein das WinSockets mittlerweile total "out" sind. (Bitte nicht hauen wenns falsch ist...)
 
Ich habe mich länger nicht mehr auf dem Punkt beschäftigt.
Ich dachte, vielleicht gibt es heutzutage eine neuere Methode sowas zu machen, aber wenn dem nicht so ist, würde ich vorschlagen, mach das mit WinSockets. Du musst eben nur kein Chatprogramm machen sondern das Server Programm eben deine Sachen auswerten lassen und Ergebnis zurück schicken oder so
 
Also wenn wir uns darauf einigen, dass ein Serverprogramm benötigt wird, das ständig läuft, und für die Kommunikation "was Modernes" verwendet werden soll, dann gibt es da WCF.
 
Zurück