Threads sind Verarbeitungszweige die eigenständig und asynchron neben dem startenden Programm gleichzeitig ausgeführt werden. Auf Multiprozessorsystemen können Threads tatsächlich auf einem eigenen Prozessor ausgeführt werden, und steigern somit die Verarbeitungsgeschwindigkeit einer Anwendung beträchtlich.
In Windowsanwendungen sollten Verarbeitungen, die eine lange Zeit dauern besser innerhalb eines Threads durchgeführt werden, damit das startende Fenster nicht für die Dauer der Verarbeitung blockiert, und die Anwendung den Eindruck macht als habe sie sich "aufgehängt".
Mit dem .NET Framework ist die Erzeugung eines Threads eine einfache Sache. Da jedoch ein eigener Thread auch eine eigene Datenbankverbindung haben sollte, mit eigener Transaktionsverarbeitung und eigenem, unabhängigem Obejktcaching, unterstützt die SOG C# Bibliothek Threadverarbeitung mit der Klasse "SOGThread".
Von SOGThread sollten eigene Klassen abgeleitet werden, und eine entsprechende Verarbeitung implementiert werden. Bitte beachten Sie, dass Sie gemeinsam genutzte Datenbereiche vor gleichzeitiger, schreibender Verwendung schützen müssen, da es sonst auf Multiprozessormaschinen zu entsprechenden Ausnahmefehlern kommen kann.
public class MyThread : SOGThread
{
public MyThread( string Name ) : base( Name )
{
}
protected override void Run()
{
// Ihre Verarbeitung
}
}
Implementieren Sie Ihre Funktionalität innerhalb der Run() Funktion. Hier steht ihnen ein eigenes AppHelper-Objekt namens "v" zur Verfügung. Außerdem werden auftretende Ausnahmen automatisch abgefangen und protokolliert.
Innerhalb von Run() sollte in regelmäßigen Abständen die Variable "Terminate" geprüft werden. Ist diese "true" möchte der Benutzer den Thread möglichst bald abbrechen. (z.B. durch schließen der Anwendung).
Durch Setzen der Variablen "erros" auf "true" können Sie dafür sorgen, das die Anwendung evt. eine Ergebnisvisualiserung zur Protokollierung stehen läst, und nicht automatisch schließt.
Erzeugen Sie Ihren Thread folgendermaßen:
MyThread worker = new MyThread( "Ihr Threadname" );
worker.Start();
Über die Funktion worker.Abort() können Sie der "Run()" Funktion einen Abbruchwunsch mitteilen.
Mit worker.WaitForEnd() können Sie auf das Ende eines Threads warten.
Über das Event OnThreadEnd können Sie sich über das Ende des Threads informieren lassen.
Innerhalb von Windowsanwendungen können Sie eine solche Verarbeitung auch mit einem Standardausgabefenster versehen. Erzeugen Sie den Thread mittels:
MyThread worker = new MyThread( "Zähler" );
DlgBusy dlg = new DlgBusy( worker );
dlg.Show();
Sie bekommen dadurch ein Fenster, in dem Statusmeldungen des Threads angezeigt werden. Das Fenster verfügt über einen Progress-Bar, der den Fortschritt der Verarbeitung anzeigen kann, sowie über eine "Abbruch" Knopf, der dem Thread den Benutzerwunsch des Abbruch signalisiert. Das Fenster wird bei fehlerfreier Beendigung der Verarbeitung automatisch geschlossen.
Verwenden Sie in Ihrer Thread-Funktion "Run()" den Aufruf:
if ( Aph.WriteStatus( "Statusmeldung", AktuellerStand, MaximalerStand ) )
return;
Zur Ausgabe von Statusmeldungen, zur Abfrage des Benutzerwunsches des Abbrechens, sowie zur Beeinflussung des Fortschrittbalkens.
Ausgabe von "Statusmeldungen bei Bedarf" unter Windows
Durch Erzeugung eines Objektes vom Typ "DlgWaitOnDemand" wird dafür gesorgt, dass eine Windowsanwendung automatisch ein kleines Statusfenster einblendet, wenn über den v-Puffer Statusnachrichten ausgegeben werden.
new DlgWaitOnDemand();
Das erzeugte "DlgWaitOnDemand" trägt sich dabei selbst als Ereignisempfänger in den V-Puffer ein, und erzeugt bei Ausgabe von Statusmeldungen ein einfaches DlgWait-Fenster, mit der entsprechenden Meldung.
Bitte sorgen Sie selbst dafür, dass dieses Fenster wieder geschlossen wird, in dem Sie eine Meldung
Aph.WriteStatus( null );
absetzen. Dies kann z.B. am Ende der Transaktion erfolgen
Statische Eigenschaften der SOG Klassen
Die SOG-Klassen bieten einige statische Eigenschaften, die den Entwickler mit wichtigen Daten versorgt. Dies sind:
Eine CultureInfo für die Verwendung mit Ein- und Ausgabefunktionen. Ein- und Ausgabefunktionen sollte immer mit einer festgelegten Culture arbeiten, um die Datenkompatibilität auch in gemischtsprachigen Umgebungen zu gewährleisten.
Eine CultureInfo für die Verwendung mit der aktuellen Benutzeroberfläche.
Eine Cultureinfo für die Verwendung innerhalb von Tools-Funktionen.
Aktuelle AppHelper-Variable
Aktuelle Session (Benutzeranmeldung)
Aktuelle Datenbank
Erzeugt oder Liefert die aktuelle Transaktion.Existiert noch keine aktuelle Transaktion, wird auf der aktuellen Datenbank eine Transaktion begonnen.
Aktueller CallContext.