MyWpfSysMenuApp

Kommentare deaktiviert für MyWpfSysMenuApp

ist ein kleines minimales Beispiel wie man das Windows Sys-Menu in einer Wpf Anwendung benutzen kann.

Folgende Features werden gezeigt:

  • Sys-Menu in einer WPF Anwendung

Das Projekt auf Github.

Advertisements

MyWpfWithSetupExampleApp

Kommentare deaktiviert für MyWpfWithSetupExampleApp

Wie schon in dem WinGUp Post angemerkt bin ich ein Fan von dem Updatemechanismus von Notpad++. Den ich in den beiden kleinen Open-Source-Projekten LogMonitor und ComMonitor schon implementiert habe. Weil er doch etwas knifflig ist und nicht so ganz einfach zu durchschauen ist, da mehrere Komponenten beteiligt sind, habe ich noch mal dieses abgespeckte Mini Projekt erstellt. In dem noch eine automatischer Check, in der Form der CheckIfUpdateIsAvailable() Funktion eingebaut ist (Hinweis die Funktion erledigt nur unter .Net 4.7 korrekt ihre Arbeit).
Der automatische Update-Mechanismus verbirgt sich in 4 Komponenten:

  • getMyWpfWithSetupExampleAppUrl.php – ein kleines Php Script das auf der entsprechenden Internetseite platziert werden muss auf der die neue Version liegt bzw. es zeigt da hin wo die neue Version liegt
  • Gup.exe – in dem der eigentliche Updatemechanismus liegt
  • gup.xml – eine Konfigurations-Datei in der u.a die aktuelle Version des Programms steht und ein Verweis auf die Php-Datei
  • libcurl.dll – wird von Gup.exe benötigt für die http und https Verbindungen

Der Button Check for Update

prüft, ob eine neue Version vorliegt was mit 1 Beep quitiert wird oder wenn keine vorliegt mit 2 Beep. CheckIfUpdateIsAvailable() vergleicht die Versionsnummer aus dem Assembly mit der Nummer, die vom Php Script zurückgegeben wird (nicht die aus der gup.xml).
Des Weiteren habe ich noch ein Setup mit Inno Setup erstellt:

Die Setup-Datei muss auf der Internetseite vorhanden sein in dem Pfad, der in getMyWpfWithSetupExampleAppUrl.php angegeben ist. Für dieses Beispiel habe ich die Datei auf meinen Web-Server gelegt. Die Php Datei liegt ebenfalls dort, die ein Xml Dokument bei Aufruf zurückgibt.

Zu bemerken wäre noch das das Ganze nur Versions Nummern bis zur 3. Stelle berücksichtigt (von 1.1.1.1 wird nur 1.1.1 verarbeitet) und das nur einstellig Version Nummer gültig sind, also z.B. 1.11.1 würde zu Problemen führen.

Folgende Features werden gezeigt:

  • Automatischer Download von Setups für Wpf Programme
  • Verbindungsaufbau aus einer Wpf App heraus auf ein Php-Script auf einem Web-Server

Das Projekt auf Github

MyEditableComboBox

Hinterlasse einen Kommentar

MyEditableComboBox ist ein kleines WPF Programm, dass in einer editierbare ComboBox sich neue Werte merkt, in einer Liste speichert, diese beim Beenden des Programms serialisiert und beim neu starten wider lädt. Zusätzlich wird auch das selektierte Element gespeichert. Wählt man den letzten Eintrag der Liste aus [DELETE_COMMAND] wird die Liste gelöscht. Vielleicht fragt sich der Eine oder Andere wo das Problem bei so einer Anforderung liegt? Nun – kein Problem – trotzdem habe ich knapp zwei halbe Tage gebraucht, bis das Programm, das tat, was ich mir vorstellte. :-)

Folgende Features werden gezeigt:

  • Editierbare ComboBox
  • Serialisierung

Das Projekt auf Github.

MyWpfStateMachine

Hinterlasse einen Kommentar

State-Machines sind, wie der Name schon vermuten lässt, eine gute Strategie um Programme oder Programmteile in einen definierten Zustand zu setzen und so bestimmte Realitäten und deren Abläufe abzubilden, Automaten zu steuern oder zu simulieren. Beispiele sind Kaffeeautomaten (Geld einwerfen, Becher kommt raus, Kaffee wird eingefüllt oder ähnliches…), Geldautomaten oder andere, kompliziertere Maschinen.
MyWpfStateMachine ist ein Wpf Programm das eine sehr einfache aber Abstrakte State-Machine darstellt:

State-Machines haben nicht nur Zustände (States) sondern auch definierte Übergänge (Transitions) von einem Zustand zu einem anderen Zustand. Das wäre auch der Unterschied zu einer einfachen Variablen und einer Case-Struktur. Es sind somit auch bestimmte Übergänge verboten, nämlich die, die nicht definiert sind.
Unsere State-Machine hat folgende Zustände:

  • Start
  • State01
  • State02
  • State03
  • State04
  • End
  • InvalidTransition (wobei das nicht wirklich ein Zustand darstellen soll)

und folgende Übergänge:

  • Command01
  • Command21
  • Command22
  • Command02
  • Command03
  • Command04

deren Zusammenhänge wie folgt sein sollen:

Die Zustände und deren erlaubten Übergänge sind in der Klasse MyStateMachine mit Hilfe eines Dictionary realisiert. Die von Konstruktor aufgerufene Funktion InitStateMachine() definiert diese.
Das eigentliche Programm hat auf der rechten Seite zwei Button Gruppen wobei die eine nur aus einem Button, nämlich Next State besteht und die andere aus den Buttons Start, Command#1 bis Command#4. Unter dem Lable Machine State kann man den Zustand der Maschine sehen.
Man hat nun die Möglichkeit den Button Next State zu drücken und so die alle Zustände zu durch laufen, an der Stelle wo es zwei Möglichkeiten gibt (nämlich bei State#1) erscheint eine MessageBox, die fragt welchen Zweig man wählen möchte, oder man drückt in der zweiten Button Gruppe (Start, Command#1 bis Command#4) ein Kommando und durchläuft so die State-Machine. Dabei kann man auch Fehler machen z.B. wenn die Maschiene den Sate State03 hat und man drückt den Button Command21, dann ertönt ein Beep und der Fehler wir in der TextBox Message unten links ausgegeben.

Folgende Features werden gezeigt:

  • Realisierung einer State-Machine
  • Gebrauch von Dictionarys in C#
  • Anzeigen von Grafiken in Tooltips

Das Projekt auf Github.

WinGUp der coole Updater von Notpad++

Hinterlasse einen Kommentar

wingup ist ein Fork von gup4win/wingup von Don HO dem Programmier von Notepap++ auf GitHub. Es ist der automatische Update-Downloader von Notepad++. Notepad++ fand ich schon immer ziemlich gut und den automatischen Download, das anschließende automatische startet des neuen Setups ist eine schicke Lösung, die unkompliziert und einfach ist.
Deswegen wollte ich den dahinter stehenden Mechanismus gerne für eigene Software nutzen (LogMonitor und ComMonitor). Diese beiden Programme sind aber nicht in C++ geschrieben wie Notepad++ sondern es handelt sich um Wpf bzw. .Net Programme. Dadurch waren einige Änderungen nötig. WinGUp führt im Prinzip 4 Aktionen aus:

  • Es prüft ob eine neuere Version der Software – auf einer bestimmten Quelle im Internet – vorhanden ist und wenn das der Fall ist, dann:
  • lädt es das neue Setup herunter
  • schließt die aktuelle laufende Software
  • und starte anschließend das neue Setup

das Beenden der aktuelle laufende Software funktioniert bei Notpad++ über die registrierte Windows Klasse der Win32 Api. Unter .Net funktioniert das nicht. Aus diesem Grund habe ich WinGUp so geändert das es nach dem Text in der Titelleiste der Anwendung sucht z.B. LogMonitor_ und dann dieses Fenster schließt. Alles andere funktioniert so wie auch bei Notpad++. Für eventuell vorkommende Leerzeichen wird ein _ gesetzt, das dann später getauscht wird.

Den Fork findet man auf GitHub

MyWpfProducerConsumerPattern

1 Kommentar

Möchte/muss man mehrere Geräte steuern/überwachen von einer Anwendung aus, so sollte man sich das Producer–Consumer-Pattern einmal genauer ansehen. Es liegt in so einem Fall nahe jedem Gerät einen Thread zuzuordnen. Die Microsoft TPL (Task Parallel Library) enthält außer den Tasks-Klasse (async/await sind wohl ihre bekanntesten Vertreter) noch andere Klassen die nützlich sind solche Probleme zu lösen z.B. die BlockingCollection Klasse. MyWpfProducerConsumerPattern ist eine kleine Wpf-Anwendung die so ein Szenario simuliert.

Es können bis zu 8 (virtuelle) Devices erzeugenden werden durch drücken des Add-Buttons, repräsentiert durch eine Task, denen man aus dem Haupt-Thread unterschiedliche Aufträge zuordnen kann. Diese werden von der zugeortneten Task abgearbeitet in dem ein zufälliger Return-Code erzeugt wird, der wiederum von in einer Queue zurück gegeben wird. Jeder Task ist eine Farbe und ein eigenes Ausgabe-Fenster zugeordnet um das ganze zu visualisieren:

Ich habe in diesem Beispiel ,die MyColoredLogListBoxDll und Teile von MyListViewControls übernommen.

Die Task, repräsentiert durch eine Lamda Funktion im Konstruktor der Device-Klasse, wartet an der Stelle


// Wait until the main thread orders an action
var action = JobQueueActions.Take();

darauf, dass der Main-Thread eine Aufgabe (JobAction) in die JobQueueActions einfügt.
Wurde die Task zum Leben erweckt mit Hilfe eines der Dynamischen Button in dem ListView so führt die bis dahin wartende Task ihre Aufgabe aus. In unserm Fall nur ein Sleep(500), dann fügt sie das Resultat in die ConcurrentQueue JobResponse ein. So kann der Main-Thread das Ergebnis threadsicher verarbeiten. Das habe wurde hier allerdings nicht implementiert. Stattdessen wurde die QueueDiplayList hinzugefügt aber nur um das Ergebnis in der ComboBox im ListView anzuzeigen. In einem richtigen Anwendungsfall würde man diese weglassen. Ansonsten Läuft sie hier genau synchron mit der JobResponse Queue. Ich habe es auch nach längerem Versuchen nicht hin bekommen die Queue in der ComboBox anzuzeigen, des wegen diese ‚unelegante‘ Lösung.
Der Vorteil des benutzen der Klassen aus der TPL liegt darin das man sich mit den ‚100 Millionen‘ Klassen und Funktionen zum Synchronisieren von Threads, die es in .Net gibt nicht herumschlagen muss (siehe: Lock, Monitor, Mutex, Semaphore, SemaphoreSlim, WaitOne, Release, Wait, AutoResetEvent … usw).

Folgende Features werden gezeigt:

Das Projekt gibt’s wie immer hier auf Github

LogMonitor

Hinterlasse einen Kommentar

ist eine weitere kleine aber vollständige Anwendung zum online betrachten von Log-Files (ähnlich wie ComMonitor, das auch eine eigene abgeschlossene Anwendung ist). Der eigentliche Grundgedanke ist aber mehr ein Anschauungsobjekt als eine professionelle Anwendung. Trotzdem erfüllt sie ihren Zweck. Ich habe mir auch hier mal die Mühe gemacht eine eigene Webseite dafür einzurichten.
Für die optische UI Darstellung habe ich MahApps.Metro library gewählt und da ich die alten Microsoft Blacklight Controls eigentlich immer ziemlich cool fand habe ich mir die Arbeit gemacht die Panels aus der Blacklight Lib heraus zu schneiden und in das Projekt einzubinden.

Ziemlich schwierig gestaltete sich die richtige Auswahl zu treffen, mit welchen der „100 Millionen“ Dateifunktionen, die .Net zur Verfügung stellt, die richtige ist. Es kam zu doch recht merkwürdigen Effekten, wie ich feststellen musste. Zum Beispiel funktionierte das ganze nur eine gewisse zeit lang, dann wurden die Files nicht mehr upgedatet (ein Phänomen das ich übrigens auch bei einigen Linux-Versionen feststellen konnte mit dem Tail-Befehl). Schließlich funktionierte die Strategie mit dem .Net FileSystemWatcher und

using (FileStream stream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
}

und

using (StreamReader reader = new StreamReader(stream))
{
}

Folgende Features werden gezeigt:

 

Das Projekt gibt’s hier und die Webseite befindet sich hier.

Older Entries