pearl.de Bestseller NEU Beratungsvideo Schnäppchen Ausgezeichnet bewertet Pressestimmen Günstig beiwww.pearl.de onlne einkaufen
PC Magazin


Walter Saumweber | Profil | Kontakt

18. November 2011
Threads für Einsteiger: Vom präemptiven Multithreading bis zur echten Parallelisierung Bild vergrößern 937 672 http://img2.magnus.de/Vom-pr-emptiven-Multithreading-bis-zur-echten-Parallelisierung-r937x671-C-9489d1fa-49723159.jpg © Hersteller/Archiv
© Hersteller/Archiv
Threads für Einsteiger

Vom präemptiven Multithreading bis zur echten Parallelisierung

Programme laufen schneller, wenn man sie auf mehrere Prozessorkerne verteilt. Deswegen kommt dem Multithreading in der Entwicklung immer größere Bedeutung zu. Wenngleich es einige Fallstricke mit sich bringt, müssen Sie auch als weniger versierter Hobbyprogrammierer nicht außen vor bleiben.

Das Betriebssystem verwaltet die auf ihm ausgeführten Programme als Prozesse mit einem oder mehreren Threads. Die Prozesse sind eigentlich reine Verwaltungseinheiten. Sie besitzen einen eigenen Adressraum sowie diverse Betriebssystemressourcen wie Codesegment, Datensegment etc.

Für die Ausführung des Programmcodes sind allein die Threads zuständig. Jeder Prozess besitzt daher zumindest einen Thread, der automatisch bei der Prozessinitialisierung erzeugt wird. Man spricht in diesem Zusammenhang vom Initial- oder Hauptthread. Auf einem Computer mit mehreren Prozessoren (Multicore) verteilt Windows die auszuführenden Threads gleichmäßig auf die Prozessoren.

Es gibt allerdings für das Betriebssystem keine Möglichkeit, die Ausführung eines Threads auf mehrere Prozessoren aufzubrechen. Für ein Programm, das nur aus einem einzigen Thread besteht, bedeutet dies, dass die Ausführung auf einem Multicore-Computer kaum zu einer Laufzeitverbesserung führen wird.

Folglich müssen Sie als Programmierer den Code auf mehrere Threads verteilen, damit Ihr Programm von einer Multicore-Architektur profitieren kann.

Es gibt aber noch einen anderen Grund, das zu tun, nämlich um zu vermeiden, dass die Benutzeroberfläche Ihres Programms einfriert. Sehen Sie sich dazu das C++-Listing in der Datei Beispiellisting.txt der Heft-DVD an (es stammt aus dem Beispielprojekt iniSearch1 ebenfalls von der DVD).


Bild vergrößern 434 255 http://img3.magnus.de/image-r434x255-C-b39cdcb2-51908346.jpg Der Befehl INI-Dateien suchen ist deaktiviert, solange die Suche läuft. © Hersteller/Archiv
© Hersteller/Archiv

Der Befehl INI-Dateien suchen ist deaktiviert, solange die Suche läuft.

Das Programm soll dem Benutzer beim Aufspüren von .ini-Dateien helfen. Die GUI besteht aus einem einfachen Menü und einer ListBox. Wenn der Anwender den Menübefehl Datei/INI-Dateien suchen aufruft, durchsucht das Programm das Laufwerk C:\ nach .ini-Dateien und trägt alle gefundenen Dateien in das Listenfeld ein.

Die Ereignisbehandlungsmethode zu dem Menübefehl INI-Dateien suchen (iniDateienSuchenToolStripMenuItem_Click()) leert zunächst das Listenfeld für den Fall, dass der Befehl wiederholt aufgerufen wird, und ruft dann die rekursive Methode sucheINIs() auf. Mit dem ersten Parameter legen Sie das zu durchsuchende Laufwerk – hier C:\ – fest.

Im zweiten Parameter inidateien speichert die Methode sucheINIs() die gefundenen .ini-Dateien als FileInfo-Objekte. Über diesen Parameter stellen Sie in der Methode iniDateienSuchenToolStripMenuItem_Click() nach Abschluss der Suche eine Datenbindung zwischen dem Listenfeld und der FileInfo-Auflistung her (listBox1->DataSource = inidateien; – mit listBox1->DisplayMember = "FullName"; legen Sie fest, dass im Listenfeld die Dateinamen samt Pfad erscheinen).

Soweit so gut, das Problem dieser Implementierung ist, dass je nach Größe des Laufwerks C:\, der Anzahl der Unterverzeichnisse und der Anzahl der gefundenen Dateien es selbst auf aktuellen und schnellen Computern unter Umständen einige Zeit dauern wird, bis der oberste Aufruf der Methode sucheINIs() (in der Ereignisbehandlungsmethode für den Menübefehl INI-Dateien suchen) zurückkehrt.

Bevor die Rekursion aber nicht beendet ist, kann der Anwender mit dem Programm nicht weiterarbeiten. Es bleibt nichts anderes übrig als abzuwarten, bis die Suche beendet ist.

Am schnellsten stellen Sie die Reaktionsfähigkeit von lahmgelegten Benutzeroberflächen dadurch wieder her, dass Sie innerhalb der Codeblöcke, die für die Lahmlegung verantwortlich sind, wiederholt die Methode DoEvents() der Application-Klasse aufrufen.

Im vorliegenden Beispiel ist dies nicht weiter schwierig, da die verantwortliche Methode sucheINIs() sich in einer Schleife selbst rekursiv aufruft und der hohe Zeitbedarf vor allem durch die Vielzahl der rekursiven Aufrufe (gleich Schleifendurchläufe) entsteht. Sie brauchen also nur den Aufruf von Application::DoEvents() in die Schleife einzubauen:


Codebeispiel:

void sucheINIs(DirectoryInfo^ verzeich
nis, List<FileInfo^>^ inidateien)
{ ... for each (DirectoryInfo^ verz in verzeichnisse)
{ Application::DoEvents();
try
{ sucheINIs(verz, inidateien); }
catch (UnauthorizedAccessException^
e) {} } ... }

Die Benutzeroberfläche bleibt nun auch nach Aufruf des Befehls INI-Dateien suchen reaktionsfähig. Wenn Sie verhindern möchten, dass der Anwender diesen Befehl erneut verwendet, während die Suche noch läuft, deaktivieren Sie diese Option vorübergehend, indem Sie vor Aufruf der Methode sucheINIs() die Eigenschaft enabled des ToolStripMenuItem auf false und anschließend wieder auf true setzen. 



Verwandte Themen

Günstig bei www.pearl.de online einkaufen
Meistgelesen
1. Samsung WB750 im Test

Handling und Bedienung der Samsung WB750 gefallen außerordentlich gut. Der Direktzugriff hilft, schnell wechselnde Motivsituationen locker zu meistern.

2. Panasonic DMC-TZ25 im Test

Sie ist eine hervorragende Reisekamera. Das Modell wiegt nur ca. 200 Gramm und passt in jede Jackentasche. Sie ist mit 3,3 cm sehr flach und verfügt…

3. Kino-Kritik: Act Of Valor

Ein Film, schlimmer als ein Ego-Shooter-Spiel: Ein halbdokumentarischer Actionfilm begleitet echte Navy Seals bei der Arbeit.

4. Fujifilm Finepix F600eXr im Test

Die Finepix F600EXR gefällt aufgrund ihrer guten Ausstattung und der intelligenten Detailfunktionen.


Top 5 Downloads
1
Recuva

Version: 1.42.544
Lizenz: Freeware
Betriebssystem: Windows

2
Win7codecs

Version: 3.6.2
Lizenz: Freeware
Betriebssystem: Windows

3
OnlineTV

Version: 6.2.0.2
Lizenz: Freeware
Betriebssystem: Windows

4
CCleaner

Version: 3.18.1707
Lizenz: Freeware
Betriebssystem: Windows

5
Firefox

Version: 13.0 Beta 4
Lizenz: Open Source
Betriebssystem: WindowsLinuxMac

Download-Suche