Simulation mechatronischer Systeme 2

Größe: px
Ab Seite anzeigen:

Download "Simulation mechatronischer Systeme 2"

Transkript

1 Simulation mechatronischer Systeme 2 Prof. Dr.-Ing. habil. G.P. Ostermeyer, Institut für Dynamik und Schwingungen, Technische Universität Braunschweig,2010 Die Windows API Threads mit der Windows API erzeugen Threads mit dem Borland C++ Builder Zusammenfassung Borland Thread-Objekte PLAN und Threads

2 Die Windows API Der Ausdruck API (Application Programming Interface) bezeichnet die Programmierschnittstelle, die Applikationen unter Windows zur Verfügung steht. Um darauf zuzugreifen, muss man die Datei <Windows.h> mittels #include in den Quellcode einbeziehen. Danach stehen viele Datentypen und Funktionen des Betriebssystems zur Verfügung. Für einige dieser Funktionen müssen noch zusätzlich Libraries hinzugefügt werden. Da von verschiedenen Programmiersprachen und Compilern aus ein Zugriff auf die Windows API möglich sein soll, hat diese eigene Datentypen definiert, die der Anwender dann in seiner speziellen Programmierumgebung benutzen muss. Windows Datentypen sind meistens groß geschrieben. Hier einige Beispiele, deren Pendant in C++ und Typenerklärung Windows Datentyp C++ Datentyp Bedeutung LONG long Ganzzahlig, 32bit, Wertebereich negativ und positiv DWORD unsigned long Double Word, 32bit, nur positive Werte HANDLE void* Ein HANDLE wird verwendet um auf ein Betriebssystem- Objekt zuzugreifen LPCTSTR const char* Zeiger auf einen nullterminierten C-String LPVOID void* LP steht im Allgemeinen für Long-Pointer Betriebssystemobjekte Datenstrukturen, die intern vom Betriebssystem gebraucht werden, z.b für die Bildschirmausgabe oder das Dateihandling werden als Betriebssystemobjekte bezeichnet. Ein Bildschirmfenster oder eine Datei sind solche Betriebssystem-Objekte. Auf diese Betriebssystem-Objekte wird über den Datentyp HANDLE zugegriffen. Für die meisten Betriebssystem-Objekte gibt es Create-Funktionen, die als Rückgabewert ein solches HANDLE liefern. Die HANDLES werden, nachdem sie nicht mehr gebraucht werden, mit der API-Funktion CloseHandle wieder zerstört und freigegeben. Auch die im nächsten Kapitel beschriebenen Threads sind Betriebssystem-Objekte.

3 Threads mit der Windows-API erzeugen Ein Thread wird verwendet um mehrere Dinge in einem Programm parallel ablaufen zu lassen. Normalerweise startet unser Programm in einer main-funktion und wird von dort aus schrittweise abgearbeitet, Eingriffe von außen sind praktisch nicht möglich. Ein Beispiel ist das Lesen von einer Schnittstelle, wie der seriellen Schnittstelle. Solange das Programm auf Daten wartet, die Schnittstelle aber nicht sendet, bleibt der Aufruf hängen. Um das zu verhindern, bietet Windows dem Programmierer die Möglichkeit parallele Verarbeitungsstränge, so genannte Threads zu erzeugen. Dazu muss dem Betriebssystem eigentlich nur mitgeteilt werden welche Eintrittsfunktion durch den neu erzeugten Thread aufgerufen wird. Diese Funktion ist wie eine Art zweite main-funktion zu sehen. Damit das Betriebssystem eine Funktion als weitere main-funktion identifizieren kann, muss diese folgende Form haben: DWORD WINAPI ThreadFunktion(LPVOID param); Der Typ der Funktion ist DWORD, d.h. sie liefert einen Rückgabewert. WINAPI bezeichnet die Aufrufkonvention, das heißt die Art wie der Compiler Argumente und Rückgabewerte behandelt. Das Argument ist ein neutraler Zeiger mit dem wir der Funktion ein selbst gewähltes Argument übergeben können. Die Funktion selbst kann einen beliebigen Namen haben. Diesen Namen müssen wir einer weiteren API-Funktion namens CreateThread übergeben. Der Aufruf von CreateThread Die CreateThread-API hat wie viele Funktionen jede Menge Parameter, wobei wir bei den meisten die default Werte übernehmen können HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpthreadattributes, SIZE_T dwstacksize, LPTHREAD_START_ROUTINE lpstartaddress, LPVOID lpparameter, DWORD dwcreationflags, LPDWORD lpthreadid); Das erste Argument ermöglicht es einen Thread als ein bestimmter Benutzer oder mit bestimmten Benutzerrechten auszuführen. Mit 0 als Argument, wird der Defaultwert, d.h. der aktuelle Benutzer gewählt. Zweites Argument ist die Stack-Größe. Jeder Thread hat einen eigenen Stack, auf dem lokale Variablen erzeugt werden! Wenn wir hier eine 0 einsetzen wird eine default - Größe gewählt. Der dritte Parameter ist die Thread-Funktion, die ausgeführt werden soll (s.o.). Der lpparameter ist ein void*-zeiger. Er wird der Thread- Funktion als Argument übergeben. Über den zweitletzten Parameter, den Creation-Flag Parameter ist es möglich, zu steuern wie der Thread erzeugt wird. Z.B. den Thread zu erzeugen aber nicht sofort zu starten. Der letzte Parameter ist ein Zeiger auf eine Variable vom Datentyp DWORD. Das Betriebssystem füllt diesen Wert mit der so genannten ThreadId. Die ThreadId dient ähnlich wie der Funktionsrückgabewert vom Typ HANDLE zur Identifikation des Threads.

4 Hier ein erstes Beispiel: #include <windows.h> DWORD WINAPI MeineThreadFunktion(LPVOID param){ // vorläufig leer return 0; int main(){ DWORD threadid = 0; HANDLE MeinthreadHANDLE = CreateThread(0,0, MeineThreadFunktion,0,0, &threadid); return 0; Dieses Beispiel wird nichts Sinnvolles (die Thread Funktion ist leer) machen, es zeigt lediglich die Verwendung der CreateThread-API Funktion. Synchronisierung von Threads Die Synchronisierung zwischen Threads ist dann nötig, wenn Threads Daten miteinander austauschen oder sonst miteinander in Kontakt treten. Die erste Art der Synchronisierung ist das Warten des Hauptthread auf die Beendigung des zweiten. So wird sichergestellt, dass vor dem Beenden der main-funktion alle erzeugten Threads gelöscht wurden. Passiert das nicht werden diese durch den Hauptthread automatisch beendet, ohne nötige interne Aufräumarbeiten zu erledigen. Wichtig ist eine Synchronisation auch dann, wenn Threads auf die gleichen Variablen oder Methoden zugreifen. Ein Beispiel wäre die parallele Ausgabe auf den Bildschirm. Je nachdem welcher Threads gerade dran ist werden die Ausgaben bunt gemischt! Eine Steuerungsmöglichkeit ist, mit einer Betriebssystem-Funktion auf bestimmte Signale von HANDLES zu warten. HANDLES von Threads werden z.b. signalisiert, wenn der zugehörige Thread beendet wurde! Die API-Funktion zum Warten auf Signale heißt : DWORD WaitForSingleObject(HANDLE handle, DWORD timeout); Das erste Argument ist das HANDLE auf das gewartet werden soll, das zweite Argument gibt an wie viele Millisekunden gewartet werden soll. Es gibt aber auch die vordefinierte Konstante INFI- NITE mit der man unbegrenzt warten kann. Der Rückgabewert ist eine vordefinierte Konstante, welche angibt wieso die Wartefunktion beendet wurde. Tabellen dieser vordefinierten Konstanten findet man z.b. in der windows.h. Einerseits könnte das HANDLE ausglöst sein, andererseits könnte die timeout Zeit abgelaufen sein.

5 Beispiel Warten auf Thread-Beendigung : #include <windows.h> DWORD WINAPI MeineThreadFunktion(LPVOID param){ return 0; int main(){ DWORD threadid = 0; HANDLE threadhandle = CreateThread(0, 0, MeineThreadFunktion,0, 0, &threadid ); DWORD wait = WaitForSingleObject(threadHANDLE, 10000); if(wait == WAIT_TIMEOUT){ // Das Time-out ist eingetreten else if(wait == WAIT_OBJECT_0){ // Das HANDLE wurde ausgelöst // Der Thread wurde also beendet return 0; In diesem Beispiel warten wir ms, also 10 Sekunden. Falls dieses TIME-OUT eintritt ist die erste Bedingung erfüllt, falls aber der Thread vorher beendet wird ist der Rückgabewert der Funktion WAIT_OBJECT_0 und die zweite Bedingung ist erfüllt. Signale mittels Events Um einem Thread mitzuteilen, dass er eine Aktion durchführen oder sich beenden soll, könnte man eine globale Variable definieren, die vom Hauptthread gesetzt wird und vom zweiten Thread ausgelesen wird. Der zweite Thread müsste dann gelegentlich überprüfen, ob die Variable verändert wurde. Diese Art der Kommunikation ist aber unsicher, denn man kann nicht verhindern das die Variable genau dann gelesen wird, wenn sie vom Hauptthread geschrieben wird, was eine Kollision verursacht. Globale Variablen sind im allgemeinen nicht für die Kommunikation von Threads geeignet. Eine verlässliche Lösung unter Windows zur Kommunikation von Prozessen sind sogenannte Events. Events sind Signale, die entweder gesetzt oder nicht gesetzt sind. Das Wichtigste dabei ist, dass man mit WaitForSingleObject abfragen kann, ob ein solches Event gesetzt ist. Hier die dazu nötigen Funktionen: HANDLE CreateEvent(LPSECURITY_ATTRIBUTES Security, BOOL ManualReset, BOOL InitialState,LPCTSTR Name); BOOL SetEvent(HANDLE Event); BOOL ResetEvent(HANDLE Event); Mit dem ersten Aufruf wird ein Event-Objekt erzeugt. Das erste Argument hat mit Zugriffsrechten zu tun. Das zweite Argument bestimmt ob ein Event mit ResetEvent zurückgesetzt werden muss. Wird hier FALSE verwendet, wird das Event automatisch in den nicht gesetzten Zustand zurückgesetzt, sobald ein Thread mit WaitForSingleObject (o.ä) erfolgreich auf das Event gewartet hat. Weitere Threads, die auch auf das Event warten, werden nicht benachrichtigt. Das dritte Argument gibt an, ob das Event mit gesetztem Zustand erzeugt wird. Mit dem vierten Argument gibt

6 man dem Event einen Namen. Wir sehen im folgenden Beispiel, wie man ein Event einsetzen kann. Beispiel: Bildschirmausgabe von zwei verschiedenen Threads #include <windows.h> #include <string> #include <iostream> using namespace std; // Datenstruktur, die dem Thread als Argument übergeben wird struct ThreadData{ HANDLE stopevent; string data; ThreadData() : stopevent(0){ ; DWORD WINAPI ThreadFunc(LPVOID param){ ThreadData* threaddata = (ThreadData*)param; while(1) { DWORD wait = 0; // wir warten hier darauf, dass das Event gesetzt wird // Falls das innerhalb von 500ms nicht geschieht, haben // wir ein Timeout, sonst wird der Thread beendet wait = WaitForSingleObject(threadData->stopEvent, 500); if (WAIT_TIMEOUT == wait){ cout << threaddata->data << endl; //Schleife verlassen und somit den Thread beenden else { break; return 69; int main() { ThreadData* threaddata = new ThreadData; threaddata->data = "Hallo Thread"; // Hier wird das Event erzeugt threaddata->stopevent = CreateEvent(0,FALSE,FALSE,"StopEvent"); DWORD threadid = 0; // Hier wird der Thread erzeugt, als Argument wird die Struktur // threaddata übergeben HANDLE h= CreateThread(0,0,ThreadFunc,(void*) threaddata, 0, &threadid); for(int i = 0; i < 8; ++i){ cout << "Main Thread" << endl;

7 Sleep(1000); // 1 Sekunde warten // Zeit bis zur Beendigung des Thread messen DWORD startwait = GetTickCount(); // Signal setzen damit der Thread merkt,dass er beenden soll SetEvent(threadData->stopEvent); DWORD wait = WaitForSingleObject(h, INFINITE); DWORD diff = GetTickCount() - startwait; cout << "Wartezeit : " << diff << " ms" << endl; // da der Thread nun sicher beendet ist, können wir // die Daten sicher löschen delete threaddata; return 0; Wir haben hier aber eines der häufigsten Probleme beim Programmieren mit Threads. Es kann geschehen, dass sowohl main-funktion als auch Thread gleichzeitig etwas auf cout ausgeben wollen. Dadurch kann der Text unterbrochen werden und komisch aussehen. Critical Sections Die API-Funktionen bieten Möglichkeiten, den Zugriff auf gemeinsame Ressourcen zu regeln. Dabei geht es darum, dass zu einem Zeitpunkt immer nur ein einzigerthread auf die gemeinsame Ressource zugreifen kann. Während dieser Zeit wird den anderen Threads der Zugriff verwehrt. Dies wird dadurch erreicht, dass wenn ein Thread einen so genannten kritischen Abschnitt betreten will, er eine Funktion aufruft, welche andere Threads solange warten lässt, bis der nächste den kritischen Abschnitt betreten darf. Beim Verlassen des kritischen Abschnittes gibt der verlassende Thread ein Signal, damit der nächste wartende Thread in den kritischen Abschnitt gelangen kann. Mit warten ist gemeint, dass der Thread vom Scheduler pausiert wird und so keinerlei Rechenzeit beansprucht. Der Scheduler ist der Teil des Betriebssystems, welcher sich um die Zuteilung von Rechenzeit an die verschiedenen Threads kümmert. Dieses Verfahren garantiert einen gegenseitigen Ausschluss. Nur ein Thread kann zeitgleich den kritischen Abschnitt betreten.

8 Beispiel Critical Section Abschnitt : #include <windows.h> CRITICAL_SECTION CS void main() {... // Initialisieren der Critical Section InitializeCriticalSection(&CS);...hier den Code eingeben // Freigeben der Critical Section DeleteCriticalSection(&CS) DWORD WINAPI ThreadFunc(LPVOID param) {... // Versuchen die Critical Section zu betreten EnterCriticalSection(&CS); // den kritischen Code ausführen... // Verlassen und freigeben der Critical Section LeaveCriticalSection(&CS);...

9 Threads mit dem Borland C++Builder Einige Programmiersprachen, wie der C++ Builder von Borland kapseln die Windows API Funktionen in eigenen Typen und vereinfachen so deren Benutzung. Borland stellt dazu die Klassen TThread und TCriticalSection zur Verfügung. Das Arbeiten mit der Klasse TThread soll im Folgenden beschrieben werden : Starten Sie den C++Builder und wählen Sie Datei->Neue Anwendung. In der Objektgalerie vom finden Sie eine Vorlage Thread-Objekt, die man per Mausklick in das Programm einfügen kann Von dem Objekt TThread wird keine Instanz gebildet, vielmehr wird eine Nachfahrklasse erzeugt und implementiert. Als nächster Schritt erfolgt die Angabe eines Namens für die neue von TThread abgeleitet Klasse per Dialog : Wir erhalten als Resultat vier Dateien, je eine Implementationsdatei mit der Endung *.cpp und eine Header Datei mit der Endung *.h für das Formblatt und genauso für unser Thread-Objekt. Die Klassendeklaration in der Thread-Header-Datei enthält einen Konstruktor und eine Implementierung der virtuellen Methode Execute(). In der Thread-CPP-Datei weist ein Informationstext auf die Problematik der Synchronsation hin. Es wird empfohlen die API -Funktion

10 Synchronize(...) zu verwenden Diese bietet eine vergleichbare Funktionalität, wie die Critical Sections unter windows. Der Zugriff auf Komponenten des Formblatts (Buttons usw.) durch mehrere Threads wird synchronisiert. Das nachfolgende Programm soll die Eingriffsmöglichkeiten des Anwenders bei einer quasi- Endlosschleife demonstrieren. Durch die Verwendung von Threads ist jederzeit ein Zugriff des Anwenders möglich, d.h. er kann das Formular schließen oder ähnliches. Ohne Thread ist erst nach Ablauf der Schleife wieder ein Eingreifen möglich. Für das Formular benötigen wir: 2 TButton Komponenten (ButtonohneThread, ButtonmitThread) 1 TLabel Komponente (DisplayLabel) Per Doppelklick auf den Schalter Bsp. Ohne Thread erscheint die zugehörige Ereignisroutine, die folgendermaßen zu füllen ist : void fastcall TForm1::StartButtonClick(TObject *Sender){ int i = 1; do { DisplayLabel->Caption = IntToStr(i); i++; while (i < ); Erzeugen Sie nun das Programm und führen es aus. Klicken Sie einmal auf den Button Bsp.ohneThread und versuchen Sie nun während das Programm rechnet das Fenster zu verschieben bzw. es in der Größe zu verändern. Achten Sie dabei auf die Anzeige des DisplayLabel. Während das Programm rechnet kann weder das Formblatt verschoben noch in der Größe verändert werden, auch an der Anzeige des DisplayLabel tut sich überhaupt nichts. Erst nach Ende der Berechnung zeigt der DisplayLabel den aktuellen Wert von i an, nämlich

11 Jetzt wird dieselbe Funktionalität innerhalb einer Thread-Methode implementiert. Wechseln Sie zur Klassendeklaration des neuen, abgeleiteten Threads und ergänzen Sie diese folgendermaßen: class TMyThread : public TThread { private: int FCount; // Zähler für die Ausgabe im Label protected: void fastcall Execute(); void fastcall AusgabeForm(); // Zusatzmethode für Synchronize! public: fastcall TMyThread(bool CreateSuspended); ; Unsere Deklaration der Thread-Klasse wird um die Variable FCount und die Methode GuiElements()ergänzt. Die Variable benötigen wir als Durchlaufzähler und GuiElements()verwenden wir für die Aktualisierung der Anzeige des DisplayLabel auf Form1. In der CPP-Datei wird im Konstruktor des Threads die Eigenschaft FreeOnTerminate = true gesetzt. Dadurch wird der Thread freigegeben sobald die Methode Terminate() aufgerufen wird. // Konstruktor fastcall TMyThread::TMyThread(bool CreateSuspended) : TThread(CreateSuspended) { FreeOnTerminate = true; // Methode void fastcall TMyThread::AusgabeForm(){ // Da wir uns nicht im Gültigkeitsbereich von Form1 befinden müssen // wir den Zeiger auf Form1 verwenden Form1->DisplayLabel->Caption = IntToStr(FCount); Die Methode Execute() hat der Assistent bereits für uns angelegt, es handelt sich hierbei um das Hauptprogramm des Thread. Execute ist eine virtuelle Methode die folgendermaßen gefüllt wird : void fastcall TMyThread::Execute(){ FCount = 1; do { Synchronize(AusgabeForm); FCount++; while (FCount <= ); Wichtig ist der Aufruf von Synchronize(). Die Funktion erfüllt den gleichen Zweck wie Critical Sections bei Konsolenanwendungen, gleichzeitiger Zugriff mehrerer threads auf den Label des Formblatts wird verhindert!

12 Wir wechseln nun zum Formblatt und fügen per Doppelklick auf den Button Bsp. mit Thread der Unit eine neue Ereignis-Routine hinzu: void fastcall TForm1::StartThreadButtonClick(TObject *Sender){ new TMyThread(false); Sobald jetzt der Konstruktor aufgerufen wird und diesem der Parameter false (für CreateSuspended) übergeben wird startet der Thread mit seiner Methode Execute(). Wenn Sie jetzt das Programm kompilieren und starten, können Sie bei laufender Berechnung problemlos das Formular verschieben und in der Größe ändern, die Berechnung wird fortgesetzt und die Anzeige ist immer aktuell. Ein Klick auf das Schließen-Symbol beendet die Anwendung unmittelbar. Der Prozessor teilt jetzt also die Zeit zwischen dem Hauptthread (Formular) und dem zweiten Thread auf und wechselt so schnell hin und her, dass beide Anwendungen scheinbar parallel laufen. Um den Wechsel am Bildschirm sichtbar zu machen, erweitern wir die Button-Routine folgendermaßen : void fastcall TForm1::StartThreadButtonClick(TObject *Sender){ new TMyThread(false); ShowMessage("VCL-Mainthread"); ShowMessage("VCL-Mainthread2"); Nach dem Start sehen Sie, dass sowohl der Thread als auch das Hauptprogramm ausgeführt wird (da während der Thread läuft, nacheinander beide MessageBoxen ausgegeben werden). Damit der Thread nach Beendigung wieder gelöscht wird, ergänzen wir die Methode noch um folgende Zeile: void fastcall TForm1::StartThreadButtonClick(TObject *Sender){ // Instanz auf die in der Klasse zugegriffen werden kann erzeugen FNewThread = new TMyThread(false); FNewThread->OnTerminate = DeleteThread; In der Methode, die dem Ereignis OnTerminate zugewiesen wird, kann der gesamte Code zum Aufräumen ausgeführt werden. void fastcall TForm1::DeleteThread(TObject* Sender) { //Der Thread wird terminiert und freigegeben (FreeOnTerminate). FNewThread->Terminate();

13 Mit diesen Zeilen stellen wir nun sicher, dass der Thread ordnungsgemäß entsorgt wird, sobald die Zählervariable Fcount den Wert erreicht hat. Wird die Anwendung aber beendet bevor dies geschehen ist, wird der Thread nicht freigegeben. Für diesen Fall erweitern wir das OnClose- Ereignis des Formulars: void fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action){ if (FNewThread) FNewThread->Terminate(); Somit wäre dafür Sorge getragen, dass der Thread in jedem Fall gelöscht wird.

14 Zusammenfassung Borland Thread-Objekt Ein Programm kann theoretisch beliebig viele weitere Threads enthalten, allerdings sagt der Thread-Guidline das ein Programm nicht mehr als 16 weitere Threads enthalten sollte, die auf keinen Fall aber alle gleichzeitig ablaufen sollten (ausprobieren! ). Ein Thread ist ein eigener Prozess der im selben Prozessbereich wie das Hauptprogramm abläuft. Somit kann ein Thread auf dieselben Daten zugreifen wie das Hauptprogramm und der Anwender muss für Thread-Sicherheit sorgen (Critical Section oder Funktion Synchronize). Die Priorität eines Threads lässt sich einstellen (z.b. über die Instanz des VCL Thread- Objekts). Die Zuteilung der Zeit an die einzelnen laufenden Threads auf dem System nimmt der Scheduler vor. Der Scheduler entscheidet anhand der Priorität eines Threads wann und wie lange oder ob überhaupt dieser Thread Prozessorzeit zugeteilt bekommt. Ein VCL Thread-Objekt verwendet man, indem man einen Nachfahren der Klasse TThread erzeugt und dessen vordefinierte Methode TThread::Execute() überschreibt. Diese Methode ist sozusagen das Hauptprogramm des Threads, sie wird sofort nach dem Aufruf des Konstruktors gestartet. Stoppen kann man den Thread durch Aufruf der Methode TThread::Terminate(). Übergibt man dem Konstruktor den booleschen Parameter false, startet der Thread unmittelbar, die Übergabe von true erzeugt zwar die Instanz, der Thread jedoch wird noch nicht gestartet. Den Start kann man dann bei Bedarf mit der Methode TThread::Resume() nachholen. Ein Thread der auf Formblatt-Elemente (Buttons, Labels, usw.) zugreift muss mit dem Hauptthread synchronisiert werden. Hierzu stellt das Thread-Object die Methode TThread::Synchronize(...) zur Verfügung. Dieser Funktion wird als einziger Parameter der Name der Methode übergeben, die alle Zugriffe auf Formblatt-Elemente erledigt. Diese Methode, wird im Kontext des Formblatt-Hauptthreads ausgeführt, was Probleme verhindert, die entstehen würden, wenn auf Variablen der Formblatt-Elemente von zwei verschiedenen Stellen aus zugegriffen würde (vergleichbar mit Critical Sections in Konsolenanwendungen) Von TThread wird das Event TThread::OnTerminate geerbt, in der Methode die Sie diesem Event zuweisen können Sie den gesamten zum Aufräumen notwendigen Code implementieren.

15 PLAN und Threads Die Verwendung von Threads in der PLAN-Umgebung unterscheidet sich kaum von der Vorgehensweise im letzten Kapitel. Bei der PLAN-Oberfläche handelt es sich im Grunde auch um ein Formblatt. Wir können also unser PLAN-Projekt öffnen und mit Datei->Neu das Thread-Objekt auswählen. Im Beispiel ist der Name des Threads PlanThread Unser Projekt besteht jetzt aus drei Quellcodedateien. user.cpp für PLAN, PlanThread.cpp und PlanThread.h für den Thread. Wenn wir in den Thread-Dateien auf PLAN zugreifen möchten, muss die Klasse TUser dort bekannt sein. Wir erzeugen also mit Datei->Neu->Headerdatei eine user.h in die wir die Klassendeklaration von TUser verschieben. Diese user.h können wir dann per #include überall einfügen wo wir die Klasse TUser benutzen möchten.

16 user.h : #include "Plan.h" #include "PlanThread.h" // mit den folgenden 2 Zeilen wird verhindert,dass der folgende Code // mehrmals includiert wird #ifndef UserH #define UserH class PlanThread; class TUser : public TPlan { public: PlanThread *pt; void Init(void); void Run(void); void Finish(void); ; #endif PlanThread.h, hier wird user.h includiert: // #ifndef PlanThreadH #define PlanThreadH #include <Classes.hpp> #include "User.h" class PlanThread : public TThread { private: protected: void fastcall Execute(); void fastcall Kreis(); public: fastcall PlanThread(bool CreateSuspended); fastcall PlanThread(bool CreateSuspended,TUser *p); ; #endif In der Header-Datei des PlanThread gibt es einen zweiten Konstruktor, dem ein Zeiger auf TUser übergeben wird, um auf die Klasse TUser zugreifen zu können. Außerdem erzeugen wir noch eine Funktion Kreis(), die alle Zugriffe auf das Formblatt von PLAN kapselt. Mit der TThread- Methode Synchronize(Kreis), die wir im letzten Kapitel schon kennen gelernt haben, kann unser Thread jetzt kollisionsfrei auf die Zeichenfläche von PLAN zugreifen.

17 Jetzt werden die Funktionen Execute() und Kreis(), wie folgt gefüllt. Der im Init() gestartete Thread soll mit höchster Priorität Kreise auf die linke Seite der Grafikfläche zeichnen, im Run()soll gleichzeitig Text auf der rechten Seite ausgegeben werden. Beachten Sie auch, dass die Änderung von BrushColor in der Run() Funktion für beide Anwendungen gültig ist. PlanThread.cpp : // #include <vcl.h> #include "User.h" #include "PlanThread.h" #pragma hdrstop #pragma package(smart_init) // Wichtig: Methoden und Eigenschaften von Objekten der VCL können // nur in Methoden verwendet werden, die Synchronize aufrufen, z.b.: // // Synchronize(UpdateCaption); // wobei UpdateCaption so aussehen könnte: // // void fastcall Unit1::UpdateCaption(){ // Form1->Caption = "In Thread aktualisiert"; // // // lokaler Zeiger auf eine Instanz von TUser TUser *PLan; // die beiden Konstruktoren fastcall PlanThread::PlanThread(bool CreateSuspended) : TThread(CreateSuspended){ // Thread in der Terminate-Funktion löschen FreeOnTerminate = true; fastcall PlanThread::PlanThread(bool CreateSuspended, TUser *p) : TThread(CreateSuspended){ PLan = p; FreeOnTerminate = true; void fastcall PlanThread::Execute(){ for (int i= 0; i<100000; i+=10) // quasi EndlosSchleife Synchronize(Kreis); // synchronisieren der Threads Terminate();

18 void fastcall PlanThread::Kreis(){ // an zufällige Positionen im Bereich x(0,500) und y(0,1000) Kreise // zeichnen int i,k; PLan->BrushColor = Rot; i = random(500); k = random(1000); PLan->Circle(i,k,50); und hier die zugehörige user.cpp //==================================================================== // Simulation dynamischer Systeme (PLAN 7.0) //==================================================================== // Threads in PLAN #include <vcl.h> #pragma hdrstop #include <vcl.h> #pragma hdrstop #include "PlanThread.h" #include "User.h" void TUser::Init(void){ // Instanz von PlanThread erzeugen und noch nicht starten pt = new PlanThread (true); // höchste Priorität setzen pt->priority = tptimecritical; // Thread starten pt->resume(); // void TUser::Run(void){ // beim Drücken auf die Run-Taste Farbe ändern Text ausgeben SetTextSize(50); SetBrushColor (FarbSkala(CallRunCount%100)); Text (600,400,"PLAN ist auch noch aktiv!"); // void TUser::Finish(void){ // Beim Beenden von PLAN thread löschen if (pt) pt->terminate(); // #pragma argsused int main(int argc, char* argv[]) { TUser a;a.execute();return 0;

19 wenn Sie das Programm jetzt starten, werden rote Kreise auf der linken Seite der Grafikfläche gezeichnet. Parallel können Sie durch Drücken auf die Run-Taste Text ausgeben und die BrushColor ändern. Auch das Schließen von PLAN ist jederzeit möglich, dabei wird der Thread über die finish()funktion gelöscht!

Erzeugen eines Threads mit der Windows-API

Erzeugen eines Threads mit der Windows-API Erzeugen eines Threads mit der Windows-API Ziel, Inhalt Wir erzeugen heute unter Windows einen zum main parallelen Arbeitsfaden (Thread) und beenden diesen auf sichere Art wieder Erzeugen eines Threads

Mehr

Vorkurs C++ Programmierung

Vorkurs C++ Programmierung Vorkurs C++ Programmierung Klassen Letzte Stunde Speicherverwaltung automatische Speicherverwaltung auf dem Stack dynamische Speicherverwaltung auf dem Heap new/new[] und delete/delete[] Speicherklassen:

Mehr

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet C++ Grundlagen ++ bedeutet Erweiterung zum Ansi C Standard Hier wird eine Funktion eingeleitet Aufbau: In dieser Datei stehen die Befehle, die gestartet werden, wenn das Programm gestartet wird Int main()

Mehr

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind Templates und Containerklassen Ziel, Inhalt Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind Templates und Containerklassen 1 Ziel, Inhalt

Mehr

Professionelle Seminare im Bereich MS-Office

Professionelle Seminare im Bereich MS-Office Der Name BEREICH.VERSCHIEBEN() ist etwas unglücklich gewählt. Man kann mit der Funktion Bereiche zwar verschieben, man kann Bereiche aber auch verkleinern oder vergrößern. Besser wäre es, die Funktion

Mehr

1 Vom Problem zum Programm

1 Vom Problem zum Programm Hintergrundinformationen zur Vorlesung GRUNDLAGEN DER INFORMATIK I Studiengang Elektrotechnik WS 02/03 AG Betriebssysteme FB3 Kirsten Berkenkötter 1 Vom Problem zum Programm Aufgabenstellung analysieren

Mehr

Datensicherung. Beschreibung der Datensicherung

Datensicherung. Beschreibung der Datensicherung Datensicherung Mit dem Datensicherungsprogramm können Sie Ihre persönlichen Daten problemlos Sichern. Es ist möglich eine komplette Datensicherung durchzuführen, aber auch nur die neuen und geänderten

Mehr

Zählen von Objekten einer bestimmten Klasse

Zählen von Objekten einer bestimmten Klasse Zählen von Objekten einer bestimmten Klasse Ziel, Inhalt Zur Übung versuchen wir eine Klasse zu schreiben, mit der es möglich ist Objekte einer bestimmten Klasse zu zählen. Wir werden den ++ und den --

Mehr

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE16-Rekursion (Stand 09.12.2011) Aufgabe 1: Implementieren Sie in Java ein Programm, das solange einzelne Zeichen vom Terminal einliest, bis ein #-Zeichen

Mehr

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss Systeme 1 Kapitel 6 Nebenläufigkeit und wechselseitiger Ausschluss Threads Die Adressräume verschiedener Prozesse sind getrennt und geschützt gegen den Zugriff anderer Prozesse. Threads sind leichtgewichtige

Mehr

Einführung in die Programmierung

Einführung in die Programmierung : Inhalt Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund - mit / ohne Parameter - mit / ohne Rückgabewerte

Mehr

Mediator 9 - Lernprogramm

Mediator 9 - Lernprogramm Mediator 9 - Lernprogramm Ein Lernprogramm mit Mediator erstellen Mediator 9 bietet viele Möglichkeiten, CBT-Module (Computer Based Training = Computerunterstütztes Lernen) zu erstellen, z. B. Drag & Drop

Mehr

Grundlagen von Python

Grundlagen von Python Einführung in Python Grundlagen von Python Felix Döring, Felix Wittwer November 17, 2015 Scriptcharakter Programmierparadigmen Imperatives Programmieren Das Scoping Problem Objektorientiertes Programmieren

Mehr

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders

Mehr

Zentrale Installation

Zentrale Installation Einführung STEP 7 wird durch ein Setup-Programm installiert. Eingabeaufforderungen auf dem Bildschirm führen Sie Schritt für Schritt durch den gesamten Installationsvorgang. Mit der Record-Funktion steht

Mehr

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) Wintersemester 2007/08 Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät für Informatik Lehrstuhl

Mehr

Durchführung der Datenübernahme nach Reisekosten 2011

Durchführung der Datenübernahme nach Reisekosten 2011 Durchführung der Datenübernahme nach Reisekosten 2011 1. Starten Sie QuickSteuer Deluxe 2010. Rufen Sie anschließend über den Menüpunkt /Extras/Reisekosten Rechner den QuickSteuer Deluxe 2010 Reisekosten-Rechner,

Mehr

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Suche schlecht beschriftete Bilder mit Eigenen Abfragen Suche schlecht beschriftete Bilder mit Eigenen Abfragen Ist die Bilderdatenbank über einen längeren Zeitraum in Benutzung, so steigt die Wahrscheinlichkeit für schlecht beschriftete Bilder 1. Insbesondere

Mehr

Delegatesund Ereignisse

Delegatesund Ereignisse Delegatesund Ereignisse «Delegierter» Methoden Schablone Funktionszeiger Dr. Beatrice Amrhein Überblick Definition eines Delegat Einfache Delegate Beispiele von Delegat-Anwendungen Definition eines Ereignisses

Mehr

Arbeiten mit UMLed und Delphi

Arbeiten mit UMLed und Delphi Arbeiten mit UMLed und Delphi Diese Anleitung soll zeigen, wie man Klassen mit dem UML ( Unified Modeling Language ) Editor UMLed erstellt, in Delphi exportiert und dort so einbindet, dass diese (bis auf

Mehr

Artikel Schnittstelle über CSV

Artikel Schnittstelle über CSV Artikel Schnittstelle über CSV Sie können Artikeldaten aus Ihrem EDV System in das NCFOX importieren, dies geschieht durch eine CSV Schnittstelle. Dies hat mehrere Vorteile: Zeitersparnis, die Karteikarte

Mehr

TeamSpeak3 Einrichten

TeamSpeak3 Einrichten TeamSpeak3 Einrichten Version 1.0.3 24. April 2012 StreamPlus UG Es ist untersagt dieses Dokument ohne eine schriftliche Genehmigung der StreamPlus UG vollständig oder auszugsweise zu reproduzieren, vervielfältigen

Mehr

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Objektorientierte Programmierung für Anfänger am Beispiel PHP Objektorientierte Programmierung für Anfänger am Beispiel PHP Johannes Mittendorfer http://jmittendorfer.hostingsociety.com 19. August 2012 Abstract Dieses Dokument soll die Vorteile der objektorientierten

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum

Mehr

Programme im Griff Was bringt Ihnen dieses Kapitel?

Programme im Griff Was bringt Ihnen dieses Kapitel? 3-8272-5838-3 Windows Me 2 Programme im Griff Was bringt Ihnen dieses Kapitel? Wenn Sie unter Windows arbeiten (z.b. einen Brief schreiben, etwas ausdrucken oder ein Fenster öffnen), steckt letztendlich

Mehr

Drägerware.ZMS/FLORIX Hessen

Drägerware.ZMS/FLORIX Hessen Erneuerung des ZMS Nutzungs-Zertifikats Lübeck, 11.03.2010 Zum Ende des Monats März 2010 werden die Zugriffszertifikate von Drägerware.ZMS/FLORIX Hessen ungültig. Damit die Anwendung weiter genutzt werden

Mehr

Lizenzen auschecken. Was ist zu tun?

Lizenzen auschecken. Was ist zu tun? Use case Lizenzen auschecken Ihr Unternehmen hat eine Netzwerk-Commuterlizenz mit beispielsweise 4 Lizenzen. Am Freitag wollen Sie Ihren Laptop mit nach Hause nehmen, um dort am Wochenende weiter zu arbeiten.

Mehr

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster Es gibt in Excel unter anderem die so genannten Suchfunktionen / Matrixfunktionen Damit können Sie Werte innerhalb eines bestimmten Bereichs suchen. Als Beispiel möchte ich die Funktion Sverweis zeigen.

Mehr

Berechnungen in Access Teil I

Berechnungen in Access Teil I in Access Teil I Viele Daten müssen in eine Datenbank nicht eingetragen werden, weil sie sich aus anderen Daten berechnen lassen. Zum Beispiel lässt sich die Mehrwertsteuer oder der Bruttopreis in einer

Mehr

Urlaubsregel in David

Urlaubsregel in David Urlaubsregel in David Inhaltsverzeichnis KlickDown Beitrag von Tobit...3 Präambel...3 Benachrichtigung externer Absender...3 Erstellen oder Anpassen des Anworttextes...3 Erstellen oder Anpassen der Auto-Reply-Regel...5

Mehr

Einrichten des IIS für VDF WebApp. Einrichten des IIS (Internet Information Server) zur Verwendung von Visual DataFlex Web Applications

Einrichten des IIS für VDF WebApp. Einrichten des IIS (Internet Information Server) zur Verwendung von Visual DataFlex Web Applications Einrichten des IIS (Internet Information Server) zur Verwendung von Visual DataFlex Web Applications Windows 8 Systemsteuerung > Programme > Windows Features aktivieren / deaktivieren > Im Verzeichnisbaum

Mehr

Zwischenablage (Bilder, Texte,...)

Zwischenablage (Bilder, Texte,...) Zwischenablage was ist das? Informationen über. die Bedeutung der Windows-Zwischenablage Kopieren und Einfügen mit der Zwischenablage Vermeiden von Fehlern beim Arbeiten mit der Zwischenablage Bei diesen

Mehr

Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER

Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER Abamsoft Finos in Verbindung mit der Webshopanbindung wurde speziell auf die Shop-Software shop to date von DATA BECKER abgestimmt. Mit

Mehr

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER Inhalt 1 Einleitung... 1 2 Einrichtung der Aufgabe für die automatische Sicherung... 2 2.1 Die Aufgabenplanung... 2 2.2 Der erste Testlauf... 9 3 Problembehebung...

Mehr

Einführung in die Programmierung (EPR)

Einführung in die Programmierung (EPR) Goethe-Center for Scientific Computing (G-CSC) Goethe-Universität Frankfurt am Main Einführung in die Programmierung (EPR) (Übung, Wintersemester 2014/2015) Dr. S. Reiter, M. Rupp, Dr. A. Vogel, Dr. K.

Mehr

M. Graefenhan 2000-12-07. Übungen zu C. Blatt 3. Musterlösung

M. Graefenhan 2000-12-07. Übungen zu C. Blatt 3. Musterlösung M. Graefenhan 2000-12-07 Aufgabe Lösungsweg Übungen zu C Blatt 3 Musterlösung Schreiben Sie ein Programm, das die Häufigkeit von Zeichen in einem eingelesenen String feststellt. Benutzen Sie dazu ein zweidimensionales

Mehr

Datenbank-Verschlüsselung mit DbDefence und Webanwendungen.

Datenbank-Verschlüsselung mit DbDefence und Webanwendungen. Datenbank-Verschlüsselung mit DbDefence und Webanwendungen. In diesem Artikel werden wir Ihnen zeigen, wie Sie eine Datenbank verschlüsseln können, um den Zugriff einzuschränken, aber trotzdem noch eine

Mehr

Computeria Solothurn

Computeria Solothurn Computeria Solothurn Seniorinnen und Senioren entdecken den Computer und das Internet Sich mit «TeamViewer» von einem Supporter helfen lassen Diese Anleitung und die Illustrationen wurden unter Mac OS

Mehr

Um ein solches Dokument zu erzeugen, muss eine Serienbriefvorlage in Word erstellt werden, das auf die von BüroWARE erstellte Datei zugreift.

Um ein solches Dokument zu erzeugen, muss eine Serienbriefvorlage in Word erstellt werden, das auf die von BüroWARE erstellte Datei zugreift. Briefe Schreiben - Arbeiten mit Word-Steuerformaten Ab der Version 5.1 stellt die BüroWARE über die Word-Steuerformate eine einfache Methode dar, Briefe sowie Serienbriefe mit Hilfe der Korrespondenzverwaltung

Mehr

Übungen 19.01.2012 Programmieren 1 Felix Rohrer. Übungen

Übungen 19.01.2012 Programmieren 1 Felix Rohrer. Übungen Übungen if / else / else if... 2... 2 Aufgabe 2:... 2 Aufgabe 3:... 2 Aufgabe 4:... 2 Aufgabe 5:... 2 Aufgabe 6:... 2 Aufgabe 7:... 3 Aufgabe 8:... 3 Aufgabe 9:... 3 Aufgabe 10:... 3 switch... 4... 4 Aufgabe

Mehr

Einführung in die Java- Programmierung

Einführung in die Java- Programmierung Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Wichtig... Mittags keine Pommes... Praktikum A 230 C 207 (Madeleine + Esma) F 112 F 113

Mehr

SafeRun-Modus: Die Sichere Umgebung für die Ausführung von Programmen

SafeRun-Modus: Die Sichere Umgebung für die Ausführung von Programmen SafeRun-Modus: Die Sichere Umgebung für die Ausführung von Programmen Um die maximale Sicherheit für das Betriebssystem und Ihre persönlichen Daten zu gewährleisten, können Sie Programme von Drittherstellern

Mehr

Installation und Inbetriebnahme von Microsoft Visual C++ 2010 Express

Installation und Inbetriebnahme von Microsoft Visual C++ 2010 Express Howto Installation und Inbetriebnahme von Microsoft Visual C++ 2010 Express Peter Bitterlich Markus Langer 12. Oktober 2012 Zusammenfassung Dieses Dokument erklärt Schritt für Schritt die Installation

Mehr

Installationsanleitung für CashPro im Mehrbenutzerzugriff/Netzwerkbetrieb

Installationsanleitung für CashPro im Mehrbenutzerzugriff/Netzwerkbetrieb Installationsanleitung für CashPro im Mehrbenutzerzugriff/Netzwerkbetrieb CashPro basiert auf Accesstechnologie 2003 und ist auch unter den aktuellen Accessversionen 2007 bis 2013 einsetzbar und Mehrbenutzerfähig.

Mehr

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu Daten Makro + VBA effektiv 5 DATEN 5.1. Variablen Variablen können beliebige Werte zugewiesen und im Gegensatz zu Konstanten jederzeit im Programm verändert werden. Als Variablen können beliebige Zeichenketten

Mehr

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java: Technische Informatik für Ingenieure (TIfI) WS 2005/2006, Vorlesung 9 II. Grundlagen der Programmierung Ekkart Kindler Funktionen und Prozeduren Datenstrukturen 9. Datenstrukturen Daten zusammenfassen

Mehr

Um dies zu tun, öffnen Sie in den Systemeinstellungen das Kontrollfeld "Sharing". Auf dem Bildschirm sollte folgendes Fenster erscheinen:

Um dies zu tun, öffnen Sie in den Systemeinstellungen das Kontrollfeld Sharing. Auf dem Bildschirm sollte folgendes Fenster erscheinen: Einleitung Unter MacOS X hat Apple die Freigabe standardmäßig auf den "Public" Ordner eines Benutzers beschränkt. Mit SharePoints wird diese Beschränkung beseitigt. SharePoints erlaubt auch die Kontrolle

Mehr

2A Basistechniken: Weitere Aufgaben

2A Basistechniken: Weitere Aufgaben 2A Basistechniken: Weitere Aufgaben 2A.3 Programmierung unter UNIX/Linux 1. Gegeben sind einige Ausschnitte von C-Programmen, die unter UNIX/Linux ausgeführt werden sollen. Beantworten Sie die zugehörigen

Mehr

Installation des Authorware Webplayers für den Internet Explorer unter Windows Vista

Installation des Authorware Webplayers für den Internet Explorer unter Windows Vista Installation des Authorware Webplayers für den Internet Explorer unter Windows Vista Allgemeines: Bitte lesen Sie sich diese Anleitung zuerst einmal komplett durch. Am Besten, Sie drucken sich diese Anleitung

Mehr

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten In dem Virtuellen Seminarordner werden für die Teilnehmerinnen und Teilnehmer des Seminars alle für das Seminar wichtigen Informationen,

Mehr

Partitionieren in Vista und Windows 7/8

Partitionieren in Vista und Windows 7/8 Partitionieren in Vista und Windows 7/8 Windows Vista und Windows 7 können von Haus aus Festplatten partitionieren. Doch die Funktion ist etwas schwer zu entdecken, denn sie heißt "Volume verkleinern".

Mehr

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7 Einrichtung des Cisco VPN Clients (IPSEC) in Windows7 Diese Verbindung muss einmalig eingerichtet werden und wird benötigt, um den Zugriff vom privaten Rechner oder der Workstation im Home Office über

Mehr

Festplatte defragmentieren Internetspuren und temporäre Dateien löschen

Festplatte defragmentieren Internetspuren und temporäre Dateien löschen Festplatte defragmentieren Internetspuren und temporäre Dateien löschen Wer viel mit dem Computer arbeitet kennt das Gefühl, dass die Maschine immer langsamer arbeitet und immer mehr Zeit braucht um aufzustarten.

Mehr

2. Semester, 2. Prüfung, Lösung

2. Semester, 2. Prüfung, Lösung 2. Semester, 2. Prüfung, Lösung Name Die gesamte Prüfung bezieht sich auf die Programmierung in C++! Prüfungsdauer: 90 Minuten Mit Kugelschreiber oder Tinte schreiben Lösungen können direkt auf die Aufgabenblätter

Mehr

Technische Dokumentation SilentStatistikTool

Technische Dokumentation SilentStatistikTool Technische Dokumentation SilentStatistikTool Version 1.0 Marko Schröder 1115063 Inhalt Einleitung... 3 Klasse Program... 3 Klasse ArgumentHandler... 3 Bereitgestellte Variablen... 3 Bereitgestellte Methoden...

Mehr

Klausur in Programmieren

Klausur in Programmieren Studiengang Sensorik/Sensorsystemtechnik Note / normierte Punkte Klausur in Programmieren Wintersemester 2010/11, 17. Februar 2011 Dauer: 1,5h Hilfsmittel: Keine (Wörterbücher sind auf Nachfrage erlaubt)

Mehr

Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten

Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten Was sind Berechtigungen? Unter Berechtigungen werden ganz allgemein die Zugriffsrechte auf Dateien und Verzeichnisse (Ordner) verstanden.

Mehr

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als

Mehr

EINFACHES HAUSHALT- KASSABUCH

EINFACHES HAUSHALT- KASSABUCH EINFACHES HAUSHALT- KASSABUCH Arbeiten mit Excel Wir erstellen ein einfaches Kassabuch zur Führung einer Haushalts- oder Portokasse Roland Liebing, im November 2012 Eine einfache Haushalt-Buchhaltung (Kassabuch)

Mehr

Installationsleitfaden kabelsafe backup professional unter MS Windows

Installationsleitfaden kabelsafe backup professional unter MS Windows Installationsleitfaden kabelsafe backup professional unter MS Windows Installationsanleitung und Schnelleinstieg kabelsafe backup professional (kabelnet-obm) unter MS Windows Als PDF herunterladen Diese

Mehr

Erstellen einer PostScript-Datei unter Windows XP

Erstellen einer PostScript-Datei unter Windows XP Erstellen einer PostScript-Datei unter Windows XP Sie möchten uns Ihre Druckvorlage als PostScript-Datei einreichen. Um Fehler in der Herstellung von vorneherein auszuschließen, möchten wir Sie bitten,

Mehr

Grundlagen Word Eigene Symbolleisten. Eigene Symbolleisten in Word erstellen

Grundlagen Word Eigene Symbolleisten. Eigene Symbolleisten in Word erstellen Eigene Symbolleisten in Word erstellen Diese Anleitung beschreibt, wie man in Word eigene Symbolleisten erstellt und mit Schaltflächen füllt. Im zweiten Teil wird erklärt, wie man mit dem Makrorekorder

Mehr

Novell Client. Anleitung. zur Verfügung gestellt durch: ZID Dezentrale Systeme. Februar 2015. ZID Dezentrale Systeme

Novell Client. Anleitung. zur Verfügung gestellt durch: ZID Dezentrale Systeme. Februar 2015. ZID Dezentrale Systeme Novell Client Anleitung zur Verfügung gestellt durch: ZID Dezentrale Systeme Februar 2015 Seite 2 von 8 Mit der Einführung von Windows 7 hat sich die Novell-Anmeldung sehr stark verändert. Der Novell Client

Mehr

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2014/2015 Wirtschaftsingenieur Bachelor 4. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2014/2015 Wirtschaftsingenieur Bachelor 4. Aufgabe Datenstruktur, Dateieingabe und -ausgabe Aufgabenstellung Für ein Baumkataster sollen für maximal 500 Bäume Informationen gespeichert werden, die alle nach der gleichen Weise wie folgt strukturiert sind: Nummer Bauminfo Baumart Hoehe Baum Umfang

Mehr

Whitepaper. Produkt: combit address manager / combit Relationship Manager. Datenabgleich zwischen Notebook und Desktop-PC / Server

Whitepaper. Produkt: combit address manager / combit Relationship Manager. Datenabgleich zwischen Notebook und Desktop-PC / Server combit GmbH Untere Laube 30 78462 Konstanz Whitepaper Produkt: combit address manager / combit Relationship Manager Datenabgleich zwischen Notebook und Desktop-PC / Server Datenabgleich zwischen Notebook

Mehr

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf http://informatik.swoke.de. Seite 1 von 18

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf http://informatik.swoke.de. Seite 1 von 18 Kapitel 3 Datentypen und Variablen Seite 1 von 18 Datentypen - Einführung - Für jede Variable muss ein Datentyp festgelegt werden. - Hierdurch werden die Wertemenge und die verwendbaren Operatoren festgelegt.

Mehr

Fakultät Angewandte Informatik Lehrprofessur für Informatik 23.01.2012

Fakultät Angewandte Informatik Lehrprofessur für Informatik 23.01.2012 WS 2011/2012 Fakultät Angewandte Informatik Lehrprofessur für Informatik 23.01.2012 Prof. Dr. Robert Lorenz Musterlösung zur Vorlesung Informatik I, Extrablatt zu komplexen Datenstrukturen Aufgabe 45 **

Mehr

GEORG.NET Anbindung an Ihr ACTIVE-DIRECTORY

GEORG.NET Anbindung an Ihr ACTIVE-DIRECTORY GEORG.NET Anbindung an Ihr ACTIVE-DIRECTORY Vorteile der Verwendung eines ACTIVE-DIRECTORY Automatische GEORG Anmeldung über bereits erfolgte Anmeldung am Betriebssystem o Sie können sich jederzeit als

Mehr

Tevalo Handbuch v 1.1 vom 10.11.2011

Tevalo Handbuch v 1.1 vom 10.11.2011 Tevalo Handbuch v 1.1 vom 10.11.2011 Inhalt Registrierung... 3 Kennwort vergessen... 3 Startseite nach dem Login... 4 Umfrage erstellen... 4 Fragebogen Vorschau... 7 Umfrage fertigstellen... 7 Öffentliche

Mehr

Kapitel 3 Frames Seite 1

Kapitel 3 Frames Seite 1 Kapitel 3 Frames Seite 1 3 Frames 3.1 Allgemeines Mit Frames teilt man eine HTML-Seite in mehrere Bereiche ein. Eine Seite, die mit Frames aufgeteilt ist, besteht aus mehreren Einzelseiten, die sich den

Mehr

Kara-Programmierung AUFGABENSTELLUNG LERNPARCOURS. Abb. 1: Programmfenster. Welt neu erstellen; öffnen; erneut öffnen; speichern; speichern unter

Kara-Programmierung AUFGABENSTELLUNG LERNPARCOURS. Abb. 1: Programmfenster. Welt neu erstellen; öffnen; erneut öffnen; speichern; speichern unter Kara-Programmierung AUFGABENSTELLUNG LERNPARCOURS Abb. 1: Programmfenster Welt neu erstellen; öffnen; erneut öffnen; speichern; speichern unter Programmfenster anzeigen Einstellungen öffnen Kara direkt

Mehr

Java Kurs für Anfänger Einheit 5 Methoden

Java Kurs für Anfänger Einheit 5 Methoden Java Kurs für Anfänger Einheit 5 Methoden Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 22. Juni 2009 Inhaltsverzeichnis Methoden

Mehr

Einrichten einer Festplatte mit FDISK unter Windows 95/98/98SE/Me

Einrichten einer Festplatte mit FDISK unter Windows 95/98/98SE/Me Einrichten einer Festplatte mit FDISK unter Windows 95/98/98SE/Me Bevor Sie die Platte zum ersten Mal benutzen können, muss sie noch partitioniert und formatiert werden! Vorher zeigt sich die Festplatte

Mehr

Native Zeichenketten (C-Strings)

Native Zeichenketten (C-Strings) Native Zeichenketten (C-Strings)... sind in C/C++ char-arrays. D.h. die Deklaration char msg[80]; kann Zeichenketten bis zur Länge 79 enthalten. (Direkte Zuweisungen wie msg="hallo!" sind jedoch nicht

Mehr

Whitepaper. Produkt: combit Relationship Manager / address manager. Dateiabgleich im Netzwerk über Offlinedateien

Whitepaper. Produkt: combit Relationship Manager / address manager. Dateiabgleich im Netzwerk über Offlinedateien combit GmbH Untere Laube 30 78462 Konstanz Whitepaper Produkt: combit Relationship Manager / address manager Dateiabgleich im Netzwerk über Offlinedateien Dateiabgleich im Netzwerk über Offlinedateien

Mehr

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben.

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben. Aufgabe 1.30 : Schreibe ein Programm DM_in_Euro.java zur Umrechnung eines DM-Betrags in Euro unter Verwendung einer Konstanten für den Umrechnungsfaktor. Das Programm soll den DM-Betrag als Parameter verarbeiten.

Mehr

Für Kunden die den neuen TopMaps Viewer EINER für ALLE als Betrachtungs-Software verwenden wollen. Top10 V1, Top25 V3, Top50 V5, WR50 V3 DVD s

Für Kunden die den neuen TopMaps Viewer EINER für ALLE als Betrachtungs-Software verwenden wollen. Top10 V1, Top25 V3, Top50 V5, WR50 V3 DVD s Detaillierte Anleitung für Kunden der neuen TopMaps Produkte Für Kunden die den neuen TopMaps Viewer EINER für ALLE als Betrachtungs-Software verwenden wollen Teil 1: Installation der Softwarekomponente:

Mehr

Software Engineering Klassendiagramme Assoziationen

Software Engineering Klassendiagramme Assoziationen Software Engineering Klassendiagramme Assoziationen Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1 Lesen von Multiplizitäten (1) Multiplizitäten werden folgendermaßen

Mehr

! " # $ " % & Nicki Wruck worldwidewruck 08.02.2006

!  # $  % & Nicki Wruck worldwidewruck 08.02.2006 !"# $ " %& Nicki Wruck worldwidewruck 08.02.2006 Wer kennt die Problematik nicht? Die.pst Datei von Outlook wird unübersichtlich groß, das Starten und Beenden dauert immer länger. Hat man dann noch die.pst

Mehr

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version 1.0.0. 23. September 2015 - 1 -

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version 1.0.0. 23. September 2015 - 1 - Matrix42 Use Case - Sicherung und Rücksicherung persönlicher Version 1.0.0 23. September 2015-1 - Inhaltsverzeichnis 1 Einleitung 3 1.1 Beschreibung 3 1.2 Vorbereitung 3 1.3 Ziel 3 2 Use Case 4-2 - 1 Einleitung

Mehr

Grundlagen. Kapitel 1

Grundlagen. Kapitel 1 Grundlagen Dieses Kapitel umfasst grundlegende Fragen und Aufgaben zur Erstellung von C++-Programmen. Hierzu zählen auch das Inkludieren von Header-Dateien Eine Header-Datei beinhaltet Informationen, die

Mehr

Tipps und Tricks zu Netop Vision und Vision Pro

Tipps und Tricks zu Netop Vision und Vision Pro Tipps und Tricks zu Netop Vision und Vision Pro Anwendungen auf Schülercomputer freigeben und starten Netop Vision ermöglicht Ihnen, Anwendungen und Dateien auf allen Schülercomputern gleichzeitig zu starten.

Mehr

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein. Schritt 1: Installation des Javacompilers JDK. Der erste Start mit Eclipse Bevor Sie den Java-Compiler installieren sollten Sie sich vergewissern, ob er eventuell schon installiert ist. Gehen sie wie folgt

Mehr

Windows 10 > Fragen über Fragen

Windows 10 > Fragen über Fragen www.computeria-olten.ch Monatstreff für Menschen ab 50 Merkblatt 103 Windows 10 > Fragen über Fragen Was ist das? Muss ich dieses Upgrade machen? Was bringt mir das neue Programm? Wie / wann muss ich es

Mehr

Bedienungsanleitung. Stand: 26.05.2011. Copyright 2011 by GEVITAS GmbH www.gevitas.de

Bedienungsanleitung. Stand: 26.05.2011. Copyright 2011 by GEVITAS GmbH www.gevitas.de GEVITAS-Sync Bedienungsanleitung Stand: 26.05.2011 Copyright 2011 by GEVITAS GmbH www.gevitas.de Inhalt 1. Einleitung... 3 1.1. Installation... 3 1.2. Zugriffsrechte... 3 1.3. Starten... 4 1.4. Die Menü-Leiste...

Mehr

Übung: Verwendung von Java-Threads

Übung: Verwendung von Java-Threads Übung: Verwendung von Java-Threads Ziel der Übung: Diese Übung dient dazu, den Umgang mit Threads in der Programmiersprache Java kennenzulernen. Ein einfaches Java-Programm, das Threads nutzt, soll zum

Mehr

Eine Anwendung mit InstantRails 1.7

Eine Anwendung mit InstantRails 1.7 Eine Anwung mit InstantRails 1.7 Beschrieben wird das Anlegen einer einfachen Rails-Anwung, die ohne Datenbank auskommt. Schwerpunktmäßig wird auf den Zusammenhang von Controllern, Views und der zugehörigen

Mehr

Die Dateiablage Der Weg zur Dateiablage

Die Dateiablage Der Weg zur Dateiablage Die Dateiablage In Ihrem Privatbereich haben Sie die Möglichkeit, Dateien verschiedener Formate abzulegen, zu sortieren, zu archivieren und in andere Dateiablagen der Plattform zu kopieren. In den Gruppen

Mehr

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0)

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0) Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0) Peter Koos 03. Dezember 2015 0 Inhaltsverzeichnis 1 Voraussetzung... 3 2 Hintergrundinformationen... 3 2.1 Installationsarten...

Mehr

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom 21.10.2013b

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom 21.10.2013b AGROPLUS Buchhaltung Daten-Server und Sicherheitskopie Version vom 21.10.2013b 3a) Der Daten-Server Modus und der Tresor Der Daten-Server ist eine Betriebsart welche dem Nutzer eine grosse Flexibilität

Mehr

AUF LETZTER SEITE DIESER ANLEITUNG!!!

AUF LETZTER SEITE DIESER ANLEITUNG!!! BELEG DATENABGLEICH: Der Beleg-Datenabgleich wird innerhalb des geöffneten Steuerfalls über ELSTER-Belegdaten abgleichen gestartet. Es werden Ihnen alle verfügbaren Belege zum Steuerfall im ersten Bildschirm

Mehr

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur Unterprogramme Unterprogramme sind abgekapselte Programmfragmente, welche es erlauben, bestimmte Aufgaben in wiederverwendbarer Art umzusetzen. Man unterscheidet zwischen Unterprogrammen mit Rückgabewert

Mehr

Anleitung zur Einrichtung eines Netzwerkes für den Gebrauch von GVService unter Windows 7

Anleitung zur Einrichtung eines Netzwerkes für den Gebrauch von GVService unter Windows 7 Anleitung zur Einrichtung eines Netzwerkes für den Gebrauch von GVService unter Windows 7 In dieser Anleitung geht es um das Bereitstellen einer zentralen GV Service Installation auf einem Server-PC, auf

Mehr

Text-Zahlen-Formatieren

Text-Zahlen-Formatieren Text-Zahlen-Formatieren Beobachtung: Bei der Formatierung einer Zahl in eine Textzahl und umgekehrt zeigt Excel ein merkwürdiges Verhalten, welches nachfolgend skizziert werden soll: Wir öffnen eine neue

Mehr

Seriendruck mit der Codex-Software

Seriendruck mit der Codex-Software Seriendruck mit der Codex-Software Seriendruck mit der Codex-Software Erstellen der Seriendruck-Datei in Windach Sie können aus der Adressverwaltung von Windach eine sogenannte Seriendruck-Datei erstellen,

Mehr

Mediumwechsel - VR-NetWorld Software

Mediumwechsel - VR-NetWorld Software Mediumwechsel - VR-NetWorld Software Die personalisierte VR-NetWorld-Card wird mit einem festen Laufzeitende ausgeliefert. Am Ende der Laufzeit müssen Sie die bestehende VR-NetWorld-Card gegen eine neue

Mehr

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf http://informatik.swoke.de. Seite 1 von 22

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf http://informatik.swoke.de. Seite 1 von 22 Kapitel 19 Vererbung, UML Seite 1 von 22 Vererbung - Neben der Datenabstraktion und der Datenkapselung ist die Vererbung ein weiteres Merkmal der OOP. - Durch Vererbung werden die Methoden und die Eigenschaften

Mehr

Tutorial: Entlohnungsberechnung erstellen mit LibreOffice Calc 3.5

Tutorial: Entlohnungsberechnung erstellen mit LibreOffice Calc 3.5 Tutorial: Entlohnungsberechnung erstellen mit LibreOffice Calc 3.5 In diesem Tutorial will ich Ihnen zeigen, wie man mit LibreOffice Calc 3.5 eine einfache Entlohnungsberechnung erstellt, wobei eine automatische

Mehr

Objektbasierte Entwicklung

Objektbasierte Entwicklung Embedded Software Objektbasierte Entwicklung Objektorientierung in C? Prof. Dr. Nikolaus Wulff Objektbasiert entwickeln Ohne C++ wird meist C im alten Stil programmiert. => Ein endlose while-schleife mit

Mehr

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe Aufgabenstellung Für eine Hausverwaltung sollen für maximal 500 Wohnungen Informationen gespeichert werden, die alle nach der gleichen Weise wie folgt strukturiert sind: Art Baujahr Wohnung Whnginfo Nebenkosten

Mehr