![]() |
Programm in Citrix Session beenden..
Hallo Forum,
Wenn auf einem Win2008 Server Citrix läuft, und mein Programm mehrfach in Sessions läuft, würd ich gerne ein SendMessage oder so schießen, damit alle Programme sich schließen ... hat jemand Erfahrungen oder Vorschäge vielen Dank Erich |
Re: Programm in Citrix Session beenden..
Hab eigentlich wenig Ahnung von Terminalservern, und wenn ich totalen Müll labere bitte ich um Nachsicht. Aber ist es nciht das Konzept von Terminalservern, daß die einzelnen Sessions eben nix voneinander wissen, sich also nicht stören können?
Sherlock |
Re: Programm in Citrix Session beenden..
Ich kenne auch nur Code von den Schweitzern, mit dem man ermitteln kann, ob das Programm in einer Terminal Session läuft - aber sessionübergreifende Nachrichten dürften auch miener Meinung nicht möglich sein. Hilft es dir denn nicht schon, wenn du weißt, ob das Programm in einer Terminal Session läuft? Was genau hast du denn vor? Evtl. finden wir eine andere Lösung
|
Re: Programm in Citrix Session beenden..
Zitat:
![]() Oder eine einfache Lösung: eine Datei an einer bestimmten Stelle als Signal verwenden. Wenn sie da ist, beenden sich die Programme. Setzt aber voraus, dass die Programme Zeit und Lust haben, an dieser Stelle ab und zu vorbeizuschauen. Viele Grüße, [edit=mkinzler]2 Beiträge zusammengefasst Mfg, mkinzler[/edit] |
Re: Programm in Citrix Session beenden..
Unter WTS oder Citrix machst du so etwas am besten mit einem globalen mutex
![]() Gruß |
Re: Programm in Citrix Session beenden..
Allerdings sollte man genau überlegen, ob auch in Zukunft wirklich nur ein Terminalserver zum Einsatz kommt.
In größeren Firmen sind davon auch gern mal mehrere, auf die sich die Anwender dynamisch bei Anmeldung verteilen. Da scheint mir eine Komunikation der einzelnen Instanzen per Netzwerk erforderlich. Denkbar z.B. auch über einen gemeinsamen Datenbankserver. |
Re: Programm in Citrix Session beenden..
Auf einem Terminalserver kann ein Programm erst dann upgedated werden, wenn auch der letzte User das Programm beendet hat.
Bei 20 und mehr Usern kann das zum Problem werden. Einfach mit dem Taskmanager alle Prozesse abschiesen ist auch keine saubere Lösung. Daher: Der Admin startet das Programm mit dem Übergabeparameter /shutdown. Das Programm sendet daraufhin eine Windows-Message an alle Nachbarprozesse, listet alle ProzessIDs in der Konsole auf und beendet sich selbst. Alle anderen Prozesse erhalten die Message und geben dem Benutzer z.B. folgende Mitteilung: Zitat:
Die Leute, die nicht gespeichert haben, haben Pech gehabt, denn nach 3 Min probiert der Admin das Gleiche nochmal. Und wird dann die restlichen Prozesse gnadenlos abschiesen (oder vielleicht vorher anrufen, wenn er nett ist). :twisted: In der Unit JclAppInst der JCL gibt es die Klasse TJclAppInstances. Damit kann man wohl alle oben beschriebenen Aufgaben erledigen. Nachtrag: ja, es klappt mit TJclAppInstances recht gut. |
Re: Programm in Citrix Session beenden..
Zitat:
Viele Grüße, |
Re: Programm in Citrix Session beenden..
Zitat:
Unter Windows Server 2003 (kein Citrix, nur Terminserver von MS) ist das nicht möglich ("cannot rename xxx. Its being used by another person or program. Close any Programs...."). |
Programm in Citrix Session beenden..
Vielen Dank für die vielen Info´s ..
Sendmessage geht nicht, Timer mit Textfile will ich eher nicht, Datei einfach umbenennen geht auch nicht, Mutex .. hmm .. tja .. mal schauen .. Momentane Überlegung:
Info betreffend: :glaskugel: WIESO Programm in Citrix-Session schließen und die momentane Vorstellung des Ablaufes: 2 Programme: Ein Updateprogramm und die Anwendung(die mehrfach in Instanzen ausgeführt wird)...
Delphi-Quellcode:
Firebird 2.1.0 . (via ZEOS)
Table: UPDATE_INFO Field: UPDATE_EXISTS Boolean Field: RUNNING_SYSTEMS Integer Wird ein Update eingespielt, setzt das Updateprogramm UPDATE_EXISTS auf True, setzt RUNNING_SYSTEMS auf null und wartet 20 Sek. Die Anwendung kontrolliert alle 15 Sek. den UPDATE_EXISTS-Wert. Ist der true, dann wird der Wert RUNNING_SYSTEMS um 1 erhöht und die UPDATE_EXISTS-Überprüfung abgebrochen. Hinweis an User: "Stell die Arbeit ein und schließe das Programm - in 5 Minuten wird es Zwangsgeschlossen" - zeitaufwändige Rechenoperationen sind ab nun nicht mehr möglich.. Beim OnClose der Anwendung wird der Wert RUNNING_SYSTEMS um 1 reduziert .. (aber nur, wenn Anwendung zuvor RUNNING_SYSTEMS um 1 erhöht hat) Das Updateprogramm wartet so lange, bis RUNNING_SYSTEMS = 0 und ersetzt dann die Anwendungsdatei und setzt UPDATE_EXISTS auf False Wenn Anwendung gestartet wird, und UPDATE_EXISTS auf True gesetzt ist - Anwendung sofort wieder schließen... Probleme: User startet Anwendung - Anwendung schließt sich aber sofort wieder, weil UPDATE_EXISTS=True (kein Showmessage oder so möglich ) User weiß eigentlich nicht - wann das Update fertig eingespielt ist, und er die Software wieder verwenden kann.. Umso mehr Spielraum beim "Zwangsschließen" (in dem Beispiel 5 Minuten) - umso länger müssen die anderen User warten, die sofort ausgestiegen sind. Zufällig könnte die Anwendung genau dann gestartet werden, wenn sie gerade ersetzt wird.. dann schmiert entweder die Anwendung ab, oder das Updateprogramm kann die Anwendung nicht ersetzen, weil sie gerade verwendet wird.. da das Zeitfenster ja doch einigermaßen groß ist . (Software als Instanz starten, fbclient.dll als Instanz starten, Zeos aufbauen.. Verbindung herstellen -- Query´s öffnen .. UPDATE_EXISTS auslesen) ... mir wird erst jetzt bewußt, das nicht das "killen" der Instanz ein Problem darstellt, sondern die ganze Logistik :gruebel: vielen Dank Erich |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:32 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