Codeservice zum Kaufen I: CSProcessInfo

Nun auch die angekündigte deutsche Erklärung zur ungewohnten englischen Beschreibung:

Wie ja an einigen Stellen erwähnt, pflege ich mehrere freie Bibliotheken für Xojo-Anwender, darunter auch die AppleLib, die Xojos Funktionen im macOS- und iOS-Bereich aufbohrt. Daran wird sich auch nichts ändern, wenngleich der Datenabgleich mit dem geshareten Code via GitHub immer wieder für Probleme sorgt (momentan ist das so; falls AppleLib, bitte die Revision 0.5.8 nehmen; neuere Upload-Versuche bringen Linkfehler im Projektfile – und ich hab schon gut zwei Tage dran gebastelt.)

Viele Anwender mögen aber gar keine große Bibliothek (auch wenn sich dort, im Gegensatz zur MacOSLib, einiges wieder rauswerfen lässt), sondern bevorzugen kleine, eigenständige Plugins oder Module, bei denen sie sich nicht mit den Feinheiten der Apple-Klassen herumschlagen müssen.

Das kann ich gut nachvollziehen, wenngleich ich selbst keine Umstände dabei empfinde, lieber aus dem Vollen zu schöpfen und die Klassen aus der Bibliothek zu verwenden. Oftmals hat das große Vorteile, wie z.B. NSColor bzw. UIColor im Gegensatz zu Xojos Color-Datentyp viel mehr Features bieten (größerer Dynamikumfang, wiederholte Bilder als „Mustertapeten-Farbe“ z.B.)

Weshalb ich mich entschlossen habe, einige Klassen nach Möglichkeit plattformübergreifend, also für iOS und macOS gleichermaßen nutzbar, herauszugeben. Und auch wenn es wünschenswert wäre, dies ebenso kostenlos zu tun: Der Satzbereich, der bisher für Miete und Brot sorgte, ist seit Beginn dieses Jahres bei mir komplett eingebrochen, und Programmieraufträge fangen das momentan noch nicht auf.

Fazit: Ich werde diese Module kostenpflichtig anbieten, allerdings zu einem schmalen Taler und ohne Lizenzlaufzeiten, ohne Lizenzierung in diesem Sinne und mit kostenlosen Updates, sofern das nicht aus dem Ruder läuft. Und grundsätzlich auch mit einer Testversion, die sich im Debug-Modus völlig unverdächtig verhält, im Build aber einen Hinweis gibt, dass da eine Demo-Version Verwendung fand.

Den Anfang bildet eine eher exotische Klasse: CSProcessInfo, oder eigentlich NSProcessInfo (CS mal für Codeservice im Gegensatz zu Satzservice, unter dem ich ja firmiere). Die Klasse ist in macOS und iOS gleichermaßen nutzbar, am besten, indem man sie auf ein Layout zieht.

MacProcessInfo.png
macOS-Demoprojekt
iOSProcessInfo.png
iOS-Demoprojekt

CSProcessInfo also versorgt einen einerseits mit ein paar Systeminformationen, was auch anderweitig erreicht werden kann, aber vor allem bietet es die Möglichkeit, kritische Prozesse beendigungssicher auszuführen – gibt es also z.B. einen Upload, der erst abgeschlossen werden sollte, kann während dieser Zeit beispielsweise der Bildschirmschlaf oder der normale Geräteschlaf abgeschaltet werden.

Unter iOS ist es sogar möglich, echte präemptive Threads zu starten. Allerdings erfordern diese Xojo-bedingt die Begrenzung auf bestimmte Features, und sie werden von Xojo nicht offiziell unterstützt. Es könnte also auch sein, dass dieses Feature irgendwann nicht mehr funktioniert. Allerdings gehe ich davon aus, dass es dann auch eine andere Möglichkeit zur Implementierung geben wird.

Einige Funktionen stehen nur unter macOS, andere nur unter iOS zur Verfügung, und mitunter erst ab bestimmten Systemversionen. CSProcessInfo  verwendet dabei sich selbst, um die Systemversion zu erfragen. Wo keine Anmerkung in der Dokumentation steht, kann davon ausgegangen werden, dass das Feature auch unliniiert vorhanden ist.

Wichtig

Unter macOS wird Joe Ranieris ObjC Blocks-Plugin benötigt. Das findet man zum kostenlosen Download hier.

Wie komme ich an die Klasse?

Eine verschlüsselte, aber bis auf den Hinweis in Builds unbegrenzt nutzbare Version mit Demos für macOS und iOS gibt es hier..

Eine Version ohne Hinweis, ebenso als verschlüsselte Klasse, sende ich nach Versand von 10 € an bogun@satzservice.de via PayPal mit dem Hinweis „ProcessInfo“.

Wer lieber den reinen Sourcecode benutzt, bekommt diesen für 30 €. Wohlgemerkt immer für iOS und macOS zugleich.

Rechtlicher Hinweis

Sie kennen das ja: Sie erhalten die Klasse so wie sie ist. Für Fehler an Projekten, irreguläres Verhalten nach Xojo-Updates, Datenverluste etc. übernehme ich keine Haftung. Allerdings sei der Hinweis erlaubt, dass so etwas bislang nicht aufgetreten ist und ich auch keinen Anlass dafür sehe. Sollten Fehler auftreten, kümmere ich mich schnellstmöglich um Lösung. Noch einmal allerdings der Hinweis, dass die iOS-Methode PerformExpiringActivity offiziell nicht von Xojo unterstützt wird und ihre Anwendung bestimmten Limitationen unterworfen ist.

Die Klasse telefoniert nicht nach Hause, benutzt keine Lizenzschlüssel und hat keine von mir eingebauten Hintertüren. Ich würde Ihr Vertrauen nicht missbrauchen und vertraue darauf, dass Sie Ihrerseits ebenso gestrickt sind.

Verwendung

Legen Sie eine Instanz der Klasse in Ihr Fenster oder iOSView (auf die Bodenleiste; CSProcessInfo ist kein Control) oder richten Sie eine Property ein und initialisieren Sie sie:

Dim CSP as New CSProcessInfo

Wichtig: CSProcessinfo registriert sich beim NSNotificationCenter, um einige Benachrichtigungen zu erhalten. Auch wenn dies über WeakAdresses funktioniert: Unter Umständen (streng genommen bei iOS, wo das „Verschwinden“ eines Views nicht ganz definiert ist) könnte dies in Kreisbezügen enden und zu einem Memoryleak führen. Wenn Sie bemerken sollten, dass Speicher nicht freigegeben wird, benutzen Sie sicherheitshalber die Unregister()-Methode, um den Speicher ganz freizugeben.

Events

Open

Feuert, wenn die Instanz initialisiert wurde.

Close

Bei macOS oder bei iOS im Falle von Unregister: Die Instanz wird gleich aus dem Speicher entfernt.

StateChanged

Auf macOS: Der thermische Zustand hat sich geändert. (Ab macOS 10.10.3)
Auf iOS: Der LowPowerMode hat sich geändert. (Since iOS 9.0)
Siehe die entsprechenden Properties.

Properties

ActiveProcessorCount As Integer

Die Anzahl aktiver CPU-Kerne des Geräts. (read-only).
Einige Faktoren können bestimmen, dass ein Kern deaktiviert wird: Boot-Befehle, thermische Drosselung oder auch Hardwaredefekte.
Ab macOS 10.5, iOS 2.0.

AutomaticTerminationSupportEnabled As Boolean

Ob Automatic Termination unterstützt wird. Ist diese Property nicht true, haben die Methoden Enable- und DisableAutomaticTermination keine Funktion.
Nur unter macOS ab macOS 10.7.

Environment As Xojo.Core.Dictionary

Ein Dictionary mitVariablennamen (keys) und ihren Werten in der Startumgebung des Prozesses. (read-only). Ab macOS 10.0, iOS 2.0.

FullUserName As Text

Der vollständige Name des angemeldeten Benutzers. (read-only) Nur macOS ab macOS 10.12.

GloballyUniqueString As Text

Globaler eindeutiger Identifikator des Prozesses (read-only). Nur macOS.

HostName As Text

Der Name des Geräts, auf dem der Prozess läuft. (read-only)

LowPowerModeEnabled As Boolean

Ob der Low Power Mode auf einem iOS-Gerät aktiv ist. (read-only). Ab iOS 9.0. Veränderungen feuern den StateChanged-Event.

MajorVersion As Integer

Die Hauptversionsnummer des Betriebssystems (read-only)

MinorVersion as Integer

Die Unterversionsnummer des Betriebssystems  (read-only)

OperatingSystemVersion as CSPropertyInfo.NSOperatingSystemVersion

Die Versionsnummer des Betriebssystems (read-only). Die Struktur ist MajorVersion As integer, MinorVersion As integer, PatchVersion As Integer.

OperatingSystemVersionString as Text

Eine Textdarstellung der Betriebssystemrevision (read-only)

PatchVersion as Integer

Die Patchversionsnummer des Betriebssystems  (read-only)

PhysicalMemory as UInt64

Die Menge an Bytes im RAM des Geräts (read-only). Ab macOS 10.5, iOS 2.0.

ProcessIdentifier as Int32

Der Identifier des Prozesses (auch alsProcess ID bezeichnet). (read-only)

ProcessName as Text

Der Name des Prozesses.
User Defaults und andere Teile der Betriebssystemumgebung benutzen diese Property – nur verändern, wenn Sie sicher sind, dass keine Probleme daraus resultieren!

ProcessorCount as Integer

Die Anzahl der CPU-Kerne des Geräts. (read-only).  Ab macOS 10.5, iOS 2.0.

SystemUptime as Double

Die Sekunden seit dem letzten Neustart des Systems (read-only). An macOS 10.5, iOS 4.0.

ThermalState as CSProcessInfo.NSProcessInfoThermalState

Der thermische Zustand des Geräts (read-only). Nur macOS ab 10.10.3
Zustände sind nominal = 0, fair = 1, serious = 2 und critical = 3.

UserName as Text

Der Kurzname des angemeldeten Benutzers (read-only) Nur macOS ab 10.12.

Methoden

Arguments() as Text()

Liefert einArray of Text mit den Kommandozeilen-Argumenten für den Prozess.

BeginActivity(LatencyCritical as Boolean, IdleSystemSleepDisabled as Boolean, IdleDisplaySleepDisabled as Boolean, SuddenTerminationDisabled as Boolean, AutomaticTerminationDisabled as Boolean, UserInitiated as Boolean, Background as boolean, Reason as CFStringRef) as Ptr

Leitet den Beginn einer Aktivität ein, für die bestimmte Systembeschränkungen gelten sollen. Liefert einenPtr, den EndActivity erwartet. Ab macOS 10.9, iOS 7.
Mit dieser Methode lassen sich z.B. Schlafzustände oder Beendigung des Programms deaktivieren, bisEndActivity aufgerufen wird.
latencyCritical: Ein Flag, um zu signalisieren, dass die Aktivität die höchstmögliche Präzision von Timern und I/O-Funktionen benötigt.
idleDisplaySleepDisabled:Wenn True, bleibt der Bildschirm an (geht nicht in den Schlafmodus)
idleSystemSleepDisabled:True verhindert den Schlafmodus im Leerlauf.
suddenTerminationDisabled:Verhindert bei True Sudden Termination, eine Methode, die das System verwendet, um z.B. beim Herunterfahren Prozesse schneller zu beenden.
automaticTerminationDisabled:Verhindert automatische Beendigung des Prozesses.
userInitiated:True signalisiert, dass die App eine Aktion auf Benutzerinitiative ausführt.
background:True signalisiert, dass die App irgendeine Aktivität ausführt, aber nicht als Resultat einer direkten Benutzeranfrage.
reason: Ein String, der während des Debuggings benutzt werden kann, um den Grund zu erfahren, aus dem die Aktivität gestartet wurde.

DisableAutomaticTermination(Reason as Cfstringref)

Verhindert automatischeBeendigung der Anwendung. Nur MacOS ab macOS 10.7. Reason: Ein String, der während des Debuggings benutzt werden kann, um den Grund zu erfahren, aus dem die Beendigung verboten ist.
AutomaticTerminationSupportEnabled muss True sein, sonst ohne Effekt!

DisableSuddenTermination()

Verhindert das schnelle Beenden der Anwendung mittels sudden termination. Nur Mac ab macOS 10.6.

EnableAutomaticTermination(Reason as CfstringRef)

Erlaubt automatischeBeendigung für die Anwendung. Nur Mac ab macOS 10.7.
AutomaticTerminationSupportEnabled muss True sein!

EnableSuddenTermination()

Erlaubt das schnelle Beenden der Anwendung mittels sudden termination. Nur Mac ab macOS 10.6.

EndActivity(Activity As Ptr)

Beendet eine mit BeginActivity gestartete Anwendung. Erwartet den Ptr, den BeginActivity geliefert hat. Ab iOS 7, macOS 10.9.

PerformActivity(LatencyCritical as Boolean, IdleSystemSleepDisabled as Boolean, IdleDisplaySleepDisabled as Boolean, SuddenTerminationDisabled as Boolean, AutomaticTerminationDisabled as Boolean, UserInitiated as Boolean, Background as boolean, Reason as CFStringRef, BlockHandle as Ptr) as Ptr

Ähnlich BeginActivity, nur wird hier ein Block erwartet, in dem die Aktivität definiert wird. Entsprechend gibt es kein EndActivity; mit Beendigung der Block-Methode wird der Normalzustand wiederhergestellt.
Ab macOS 10.9, iOS 7.
latencyCritical: Ein Flag, um zu signalisieren, dass die Aktivität die höchstmögliche Präzision von Timern und I/O-Funktionen benötigt.
idleDisplaySleepDisabled: Wenn True, bleibt der Bildschirm an (geht nicht in den Schlafmodus)
idleSystemSleepDisabled: True verhindert den Schlafmodus im Leerlauf.
suddenTerminationDisabled: Verhindert bei True Sudden Termination, eine Methode, die das System verwendet, um z.B. beim Herunterfahren Prozesse schneller zu beenden.
automaticTerminationDisabled: Verhindert automatische Beendigung des Prozesses.
userInitiated: True signalisiert, dass die App eine Aktion auf Benutzerinitiative ausführt.
background: True signalisiert, dass die App irgendeine Aktivität ausführt, aber nicht als Resultat einer direkten Benutzeranfrage.
reason: Ein String, der während des Debuggings benutzt werden kann, um den Grund zu erfahren, aus dem die Aktivität gestartet wurde.
Blockhandleist das Handle eines ObjC- oder iOSBlocks, der aus einer Methode ohne Ein- und Ausgabeparameter gebildet wurde.

PerformExpiringActivity(Reason as CFStringRef, Block as iOSBlock)

Führt den Block asynchron aus(!) – also auf einem HintergrundThread! –  und benachrichtigt die Blockmethode, wenn ihre Zeit abläuft.Nur iOS ab 8.2.
reason: Ein String, der während des Debuggings benutzt werden kann, um den Grund zu erfahren, aus dem die Aktivität gestartet wurde.

Block mussein iOSBlock sein, der aus einer Methode erzeugt wurde, die einen Booleschen Eingabeparameter besitzt. In diesem wird signalisiert, dass die Aktivität ausläuft. Entsprechend sollte dieses Flag zum Beenden der Block-Aktivitäten führen. Echte präemptive Threads werden von Xojo nicht offiziell unterstützt. Die Methode muss  nilobjectChecking, Backgroundtasks und StackoverflowChecking ausschalten und darf keine Objekte oder Instanz-Properties verwenden. Wohl aber ist es möglich, mittels Declare OS-Objekte zu erzeugen, solange man auf direkter Declare-Ebene bleibt (also Ptr benutzt und keine Objekt-Wrapper anlegt). Auch können Klassen-Properties verwendet werden (gesharete Properties).

SystemVersionIsAtLeast(majorversion as integer, minorversion as integer = 0, patchversion as integer = 0) as Boolean

Liefert einen Booleschen Wert, der angibt, ob das aktuelle System mindestens der angegebenen Version entspricht.

Unregister()

Um Speicherlecks zu vermeiden, insbesondere unter iOS, kann diese Methode verwendet werden, um die Registrierungen der Notifications zu löschen. Ansonsten nicht einsetzen, da die Events dann nicht mehr funktionieren!

 

 

Abschließend noch einmal der Link zur Demoversion.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s