Windows-Multithreading



Ähnliche Dokumente
Vorkurs C++ Programmierung

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

DialDirectly (for Skype ) by Infonautics GmbH, Switzerland

Einführung in die Programmierung

Objektorientierte Programmierung

Lehrer: Einschreibemethoden

So greifen Sie über WebDAV auf Dateien auf dem Extranet der Pfimi Kirche Waldau zu

M-net -Adressen einrichten - Apple iphone

Stellvertretenden Genehmiger verwalten. Tipps & Tricks

Local Control Network

Programmierkurs Java

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

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

Anleitungen zum KMG- -Konto

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

Anleitung Grundsetup C3 Mail & SMS Gateway V

Zählen von Objekten einer bestimmten Klasse

Deklarationen in C. Prof. Dr. Margarita Esponda

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten

Erzeugen eines Threads mit der Windows-API

DIE ZUKUNFT BEGINNT JETZT: ELEKTRONISCHE UNTERSCHRIFT

Einrichten des Elektronischen Postfachs

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

Installationsanleitung ETK RPC2 Schnittstelle (hier: Anzeige Sonderausstattung, Lackcode, Polstercode im ETK)

Aktivierung von Makros in den Erfassungshilfen

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

1 Vom Problem zum Programm

DELFI. Benutzeranleitung Dateiversand für unsere Kunden. Grontmij GmbH. Postfach Bremen. Friedrich-Mißler-Straße Bremen

ICS-Addin. Benutzerhandbuch. Version: 1.0

Visualisierung auf Büro PC s mit dem ibricks Widget

Einführung in die Programmierung (EPR)

Dokumentation PuSCH App. windows-phone

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Kurzanleitung MAN E-Learning (WBT)

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Softwarelösungen: Versuch 4

Benutzung des NAM. Starten Sie Ihren Browser und rufen Sie folgende Adresse auf:

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Wollen Sie einen mühelosen Direkteinstieg zum Online Shop der ÖAG? Sie sind nur einen Klick davon entfernt!

Fax einrichten auf Windows XP-PC

Einrichtung HBCI-Chipkarte in VR-NetWorld-Software

Einbindung einer ACT!12-16 Datenbank als Datenquelle für den Bulkmailer 2012

Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER

Seite 1 von 14. Cookie-Einstellungen verschiedener Browser

Windows 8.1. Grundkurs kompakt. Markus Krimm, Peter Wies 1. Ausgabe, Januar inkl. zusätzlichem Übungsanhang K-W81-G-UA

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

Für die Einrichtung mit jedem beliebigen Client gelten grundsätzlich folgende Daten:

1. Allgemeines zum tevitel.wq-monitor Seite WQ-Monitor konfigurieren Seite 4

Erstellen einer digitalen Signatur für Adobe-Formulare

Computeria Solothurn

Workflows verwalten. Tipps & Tricks

Technische Dokumentation SilentStatistikTool

The Cable Guy: Dynamische DNS-Aktualisierung in Windows 2000

Programmierung in C. Grundlagen. Stefan Kallerhoff

Software Maintenance - Musterlösung zum Übungsblatt 1

SMS-Dienst SMS-Dienst procar informatik AG Stand: FS 04/2011 Eschenweg Weiterstadt 1

AUTOMATISCHE -ARCHIVIERUNG. 10/07/28 BMD Systemhaus GmbH, Steyr Vervielfältigung bedarf der ausdrücklichen Genehmigung durch BMD!

Delegatesund Ereignisse

FastViewer Remote Edition 2.X

Installation und Inbetriebnahme von Microsoft Visual C Express

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen

Automatisierung ( Fernsteuerung ) von Excel unter Microsoft Windows Tilman Küpper (tilman.kuepper@hm.edu)

Adobe Connect Tutorial

Übungen Programmieren 1 Felix Rohrer. Übungen

Arbeiten mit dem Outlook Add-In

Anwendungsbeispiele Buchhaltung

Windows 8.1. Grundkurs kompakt. Markus Krimm, Peter Wies 1. Ausgabe, Januar 2014 K-W81-G


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

Partitionieren in Vista und Windows 7/8

teischl.com Software Design & Services e.u. office@teischl.com

Grundlagen der Programmierung Prof. H. Mössenböck. 10. Klassen

Einführung in die Programmierung

Leitfaden zum Sichern einer Festplatte als Image mit der System Rescue CD

Datenübernahme aus Profi-Cash

Internet Explorer Version 6

Bitte wenden. Name: KURSARBEIT NR. 4 (10 DIFF GA) Seite 1

Datenexport aus JS - Software

Was meinen die Leute eigentlich mit: Grexit?

System-Makro in time.h : #define CLOCKS_PER_SEC 1000 Frühere Makro-Bezeichnung (z.t. noch gebräuchlich): #define CLK_TCK CLOCKS_PER_SEC//aus:time.

Ihr CMS für die eigene Facebook Page - 1

Bitte verwenden Sie nur dokumentenechtes Schreibmaterial!

Installation SPSS Netzwerkversion (Mac)

Eine Anwendung mit InstantRails 1.7

Anleitungen zum Publizieren Ihrer Homepage

Wie können Sie eine Client Lizenz wieder freigeben?

Anleitung für den tisoware webclient in der Version 9.5a

SharePoint Demonstration

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Verwendung des IDS Backup Systems unter Windows 2000

Pflegeberichtseintrag erfassen. Inhalt. Frage: Antwort: 1. Voraussetzungen. Wie können (Pflege-) Berichtseinträge mit Vivendi Mobil erfasst werden?

Warenwirtschaft Handbuch - Administration

Beispiel Shop-Eintrag Ladenlokal & Online-Shop im Verzeichnis 1

Dr. Monika Meiler. Inhalt

Tutorials für ACDSee 12: Hochladen von Fotos auf Ihren Account bei ACDSeeOnline.com

Hilfe zur Einwahl ins Uniserv Webinar mit WebEx

Bedienungsanleitung für den Online-Shop

Backup der Progress Datenbank

Architektur Verteilter Systeme Teil 2: Prozesse und Threads

efa elektronisches Fahrtenbuch im Berliner Ruder-Club

Transkript:

DOS 2.0: Hintergrundprzesse als TSR-Prgramme : Terminate and Stay Resident (d.h.: keine Speicher-Freigabe) ermöglichte Verfügbarkeit/ Reaktivierbarkeit (meist über Htkey ) z.b.: Verwaltung / Versrgung vn Druckaufträgen (Screensht, Drucker-Spler); nicht-englische Tastaturtreiber 16-Bit-Windws(1985): Nicht-präemptives Multitasking: Peripherie (Tastatur, Maus) knnte Nachricht (Aufruf) auslösen, die inaktives Prgramm im Speicher aktivierte. Prgramm mußte für Kntrll-Abgabe knzipiert sein ( kperatives Multitasking), snst Blckierung möglich. OS/2 (MS/IBM, 1988): Präemptives Multitasking: Sw ( Presentatin Manager ) rdnete Ereignisse den laufenden Prg. zu. Warten auf (serielle) Ereignis-Zustellg wirkte entgegen. z.b.: lange Text-Sicherung verzögert Fkus-Wechsel

32-Bit-Windws (1995): Multithreading: Aufteilung der Anweisungsflgen eines Prgramms in mehrere Ausführungsstränge, die parallel (präemptiv) ausgeführt werden. Der Hauptthread (primary) kann weitere (secndary) Threads erzeugen und diese wiederum andere. Alle Threads erhalten (verdrängend) Kntrlle/CPU-Zeit wie separate Prgramme bekmmen eine eigene Nachrichtenwarteschlange zugewiesen gehören zum selben Przeß (teilen Speicher und static-variablen) haben eigene Stacks (lkale Var. und Przessr-/Cprz.-Zustand) Wichtige Kriterien bei der Einrichtung vn Threads: Hauptthread f. Erzeugung v. Fenstern u. Verteilung v. Nachrichten, alle anderen zur Erledigung vn Aufgaben im Hintergrund. z.b.: Windws-Aufrufe jederzeit bedienen 1/10-sec-Regel : was länger braucht, gehört in den Hintergrund z.b.: Menü-/Prgramm-Nutzung während langwieriger Speicherung Thread-Abspaltung auf Sinnfälligkeit überprüfen z.b.: Bildbearbeitung während Bildladen fragwürdig

Anlegen und Starten des Threads ThreadPrc(): #include <windws.h> //genauer: winbase.h Thread- Kennung HANDLE CreateThread (LPSECURITY_ATTRIBUTES lpthrattr, DWORD dwstacksize, DWORD WINAPI ThreadPrc, LPVOID lpparam, DWORD dwflags, LPDWORD lpthreadid); Sfrtiges Beenden eines Threads (bei return entbehrlich): VOID ExitThread (DWORD dwexitcde);//beendet ThreadPrc BOOL ClseHandle(HANDLE handle); //Resrc.freigabe(@TRUE) Parameter: lpthrattr: dwstacksize: ThreadPrc: lpparam: dwflags: lpthreadid: dwexitcde: Zeiger auf interne Struktur (betr.interprz.-kmmun.): NULL Startwert Stackgröße (0: Standard autm. Anpassung) Adresse DWORD WINAPI ThreadPrc (PVOID *lpparam) (32-Bit-)Argument vn ThreadPrc() 0. CREATE_SUSPENDED: wartet bis ResumeThread-Aufruf Zeiger auf 32-Bit-Var., die Thread-Kennung erhält (. NULL) Exit-Cde (individuelle 32-Bit-Variable z.b. lpparam)

Thread-Kennung (Handle) Empfhlene Funktin zum Anlegen und Starten vn ThreadPrc(): #include <prcess.h> unsigned lng _beginthread( vid( cdecl *ThreadPrc)(vid *), unsigned uistacksize, vid *pparam); Sfrtiges Beenden und Ressurcen-Freigabe eines Threads: vid _endthread (vid); //bei return entbehrlich Parameter: ThreadPrc: uistacksize: pparam: Startadresse vn vid ThreadPrc(vid *pparam) [ genauer: vid cdecl ThreadPrc (vid *pparam); cdecl: default calling cnventin fr C / C++ prgrams ] anfängliche Stackgröße; 0: Standardwert (1 MB) bei Bedarf autmat. Anpassung (32-Bit-)ThreadPrc()-Argument; meist: Struktur-Zeiger Einzige Möglichkeit zur Thread-Individualisierung!

Thread-Synchrnisatin (I) Blckierung des generierenden (primären) Threads, damit seine Beendigung nicht vrzeitig die sekundären Threads beendet: #include <windws.h> //genauer: winbase.h DWORD WaitFrMultipleObjects (DWORD ncunt, CONST HANDLE *handle, BOOL WaitAll, DWORD msec); Parameter: ncunt: Anzahl zu synchrnisierender (sekundärer) Threads handle: Zeiger auf Feld mit (Thread-. anderen Objekt-)Handles WaitAll: Typ des Wartens (TRUE: warten auf alle Threads; FALSE: warten, bis irgendein Thread fertig ist) msec: max. Wartezeit in Millisekunden (INFINITE: beliebig) Rückgabewert: Grund zur Beendigung des Wartens (Kennzahl)

Beispiel: Multi-Timer typedef struct { time_t start, tbell[num]; timerdat; //#define NUM 5 vid bell(vid *idx) {static timerdat *tim=null; time_t tj=0,ttick=0;//int j1=0; if (!tim) tim = init(); d { time(&tj); if (tj>=ttick){ system(cls); /*(...)*/ fr (j1=0; j1<num; j1++) /*..printf()..*/; ttick++; while(tj<tim->tbell[(int)idx]); printf("\a"); // beep return; timerdat *init(vid) //Speicher: {static timerdat tim; tim.tbell[0]=5; tim.tbell[1]=10; tim.tbell[2]=15; tim.tbell[3]=8; tim.tbell[4]=7; time(&tim.start); return(&tim); vid multibell(vid) {int j1=0; int Zeiger knvertierbar fr(j1=0;j1<num;j1++) bell((vid*)j1); return; int main (vid) { multibell(); system(cls); return 0; (MultiBell.exe)

Beispiel: Multi-Timer (Thread-Versin) typedef struct { time_t start, tbell[num]; timerdat; //#define NUM 5 vid bell(vid *idx) {static timerdat *tim=null; time_t tj=0,ttick=0;//int j1=0; if (!tim) tim = init(); d { time(&tj); if (tj>=ttick){ system(cls); /*(...)*/ fr (j1=0; j1<num; j1++) /*..printf()..*/; ttick++; while(tj<tim->tbell[(int)idx]); printf("\a"); // beep _endthread(); return; timerdat *init(vid) //Speicher: {static timerdat tim; tim.tbell[0]=5; tim.tbell[1]=10; tim.tbell[2]=15; tim.tbell[3]=8; tim.tbell[4]=7; time(&tim.start); return(&tim); vid multibell(vid) {int j1=0; unsigned lng hthread[num]; fr(j1=0;j1<num;j1++)hthread[j1]= _beginthread(bell,0,(vid*)j1); WaitFrMultipleObjects(NUM, (CONST HANDLE)hThread, TRUE, INFINITE); return; int main (vid) { multibell(); system(cls); return 0; (MultiBellThread.exe)

Thread-Synchrnisatin (II) Einrichtung kritischer Abschnitte zur Verhinderung v. Kllisinen bei Inanspruchnahme exklusiv nutzbarer Ressurcen; Implementierung als Instanz einer (Windws-internen) Struktur LPCRITICAL_SECTION, die nur durch 4 Systemfunktinen manipuliert werden darf: #include <windws.h> //genauer: winbase.h Vereinbarung und Initialisierung der benötigten Struktur für den Schutz einer Ressurce: CRITICAL_SECTION cs; VOID InitializeCriticalSectin(LPCRITICAL_SECTION *cs); Eintritt in den bzw. Austritt aus dem kritischen Abschnitt: VOID EnterCriticalSectin (LPCRITICAL_SECTION *cs); VOID LeaveCriticalSectin (LPCRITICAL_SECTION *cs); zeitkritisch! Freigabe der Ressurcen eines kritischen Abschnitts: VOID DeleteCriticalSectin (LPCRITICAL_SECTION *cs);

Beispiel: Multi-Timer (Thread/CS-Versin) typedef struct {/*...*/ CRITICAL_SECTION cs4pr; timerdat; Thread-Identifikatin! vid bell(vid *idx) { static timerdat *tim=null; if (!tim) tim = init(); /* (...) */ EnterCriticalSectin (&tim->cs4pr); /*system(cls); printf(...)*/ LeaveCriticalSectin (&tim->cs4pr); /* (..._endthread();...) */ return; vid multibell(vid) { int j1=0; unsigned lng hthread[num]; static timerdat *tim=null; if (!tim) tim = init(); InitializeCriticalSectin (&tim->cs4pr); fr (j1=0; j1<num; j1++) { hthread[j1] = _beginthread (bell,0,(vid *)j1); universeller Zeiger! WaitFrMultipleObjects (NUM, (CONST HANDLE)hThread, TRUE, INFINITE); DeleteCriticalSectin (&tim->cs4pr); return; (MultiBellThreadCS.exe)

Thread-Synchrnisatin (III) #include <windws.h> Event-Kennung //genauer: winbase.h Thread-Blckierung (-Suspendierung) für msec Millisekunden: VOID Sleep(DWORD msec); Verknüpfg d. WaitFr...-Funktinen mit Ereignissen hne Handle: Event erzeugen, setzen, zurücksetzen: HANDLE CreateEvent (LPSECURITY_ATTRIBUTES lpthrattr, BOOL bmanreset,bool binitstate,lpctstr lpname); BOOL SetEvent (HANDLE handle);//event gesetzt(return!=0) BOOL ResetEvent(HANDLE handle);//ev.zurückgesetzt(r.!=0) Parameter: lpthrattr : Zeiger auf interne Struktur (betr.interprz.-kmmun.): NULL bmanreset : Erwartetes Zurücksetzen (TRUE= manuell : durch Aufruf v. ResetEvent; FALSE: autm., nach d. ersten Thread-Start) binitstate : lpname : Anfangszustand (TRUE: gesetzt; FALSE: zurückgesetzt) Zeiger auf Event-Namen( sz :"string terminated with a zer")

Bemerkungen zu den vrausgegangenen Flien: Htkey: Taste(nkmbinatin) zur Aktivierung einer bestimmten Rechner-(BS-) Funktin. Spl: Simultaneus Peripheral Operatins OnLine Nnpreemptive (cperative) Multitasking wird ins Deutsche als nicht-verdrängender Mehrprzeßbetrieb übertragen ( preemptin bezeichnet allg. das Vrkaufsrecht ). Thread wird ins Deutsche als Ausführungsstrang übertragen (engl. für: Faden, Garn, Zwirn ) Abwicklungsflge: Kleinste Verarbeitungseinheit (BS, Appl.), der Rechenzeit zugewiesen wird. Typische Größenangaben: max. 2028 Threads je 1MB Stack; 20 msec (=1/50 sec) je Time Slice Der Bezeichner cdecl ist (nur) insfern vn Interesse, als er die Standard-Einstellungen des Cmpilers wieder einsetzt, falls sie zuvr außer Kraft gesetzt wrden waren. Die Funktin DWORD WaitFrSingleObject(HANDLE handle,dword msec); wurde hier nicht näher besprchen, weil sie gegenüber WaitFrMultipleObjects (abgesehen vm Handle-Typ HANDLE gegenüber CONST HANDLE) hauptsächlich eine eingeschränkte Funktinalität bietet. CreateThread() hat gegenüber _beginthread() den Vrzug, daß sein Bezeichner, seine verwendeten Datentypen und sein "Outfit" zu einer "Familie" gehören (vgl. CreateWindw). Seine Nachteile sind (u.a.): Es benötigt mehr (und selten genutzte) Parameter, getrenntes Exit und Clse (Erlernen, Rechenzeit, Fehler-Quellen); Es erfrdert eine Thread-Funktin vm nicht-universellen Typ DWORD WINAPI ThreadPrc(); Es kann zu geringem Speicherschwund (small memry leaks) führen, wenn es mit der C- Laufzeitbiblithek verwendet wird. (BS bzw. Applikatin) Bsp.: s. SysPrg-Klausur WS 04/05