Thread Anlage Wiederverwendbar
 
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Threads gibt es in Windows, in UNix (siehe galileocomputing.de/openbook/unix_guru, in Java, und insbesondere in Echtzeitsteuerungen mit RTOS. Die Methoden bzw. Funktionen sind für jedes System anders. Folgend wird gezeigt, wie in Windows ein Thread-Programmiermodell Java-like verwendet werden kann. Das hat nichts zu tun mit Java selbst, nur der Style ist wie Java. Benutzt man diese Schale um die Windows-API-Aufrufe, dann sind die Anwenderprogramme nicht mehr windows-spezifisch.

Der Inhalt ist erstmal aus einem Beitrag von mir im Wikipedia kopiert, sollte dort Threads unter Windows erklären, führt aber in dieser Beziehung dort zu weit. Hier sollte wiederum etwas mehr stehen, ... kann noch werden.

Um in Windows in C oder C++ einen eigenen Thread zu erzeugen, kann man direkt auf die Windows-API-Schnittstellen zugreifen. Dazu muss man als einfaches Muster aufrufen:

 #include <winbase.h>
 unsigned long threadId;
 HANDLE hThread = CreateThread?(NULL, 2000, ({LPTHREAD START ROUTINE}?)runInThread, p1, p2, &threadId);

run_in_thread ist die Subroutine, die im diesem Thread laufen soll, sie wird unmittelbar danach aufgerufen. Wird runInThread beendet, dann ist auch der Thread beendet, ähnlich wie Thread::run() in Java.

Diese API-Schnittstelle ist eine C-orientierte Schnittstelle. Um Threads auch objektorientiert zu programmieren, kann nach folgendem Schema in der Subroutine <code>runInThread</code> eine Methode einer Klasse gerufen werden:

 void run_in_thread(void* runnable_instance)
 { Runnable* runnable = (Runnable*)(runnable_instance);  //Klassenzeiger? oder Zeiger auf Basisklasse
   runnable->run();                                     //run-Methode dieser Klasse wird gerufen. 
 }

Diejenige Klasse, die die run()-Methode für den Thread enthält, ist hier in einer Klasse Runnable enthalten, das kann auch einen Basisklasse einer größeren Klasse sein. Der Zeiger auf die Instanz einer gegebenenfalls von Runnable abgeleiteten Klasse muss bei Create_thread als Parameter p1 übergeben werden, und zwar als (Runnable*) gecastet. Damit hat man hier die gleiche Technik wie bei Java in der Hand. Wie folgt wird die universelle Basisklasse (ein Interface) für alle Klassen, deren run()-Methoden in einem eigenem Thread laufen sollen, definiert:

 class Runnable             //das ist ein Interface
 {  virtual void run()=0;
 };

Folgend wird die Anwenderklasse, mit der run()-Methode definiert:

 class My_thread_class : public Runnable
 {  virtual void run();
    void weitere_methode();
 };

Folgend wird die Anwenderklasse instanziiert und der Thread gestartet:

 My_thread_class* my_thread = new My_thread_class();
 hThread = Create_thread(NULL, 2000, ({LPTHREAD START ROUTINE}?) run_in_thread, (Runnable*)(my_thread), 0, &thread_id);

Wegen des dynamischen Bindens wird die gewünschte Methode my_thread->run() gerufen:

 void My_thread_class::run()  
 { weitere_methode();        //also sind auch alle weiteren Dinge dieser class aufrufbar.
 }

Weitere Zugriffe auf den Thread auf API-Ebene können unter Kenntnis des zurückgelieferten HANDLE ausgeführt werden, beispielsweise

  Set_thread_priority(h_thread, 3);


PS: Es fällt hier auf, dass die Idee in DseWiki, alles was in der Mitte Großbuchstaben hat, automatisch als Seite aufzunehmen, für die Darstellung von Programmierbeispielen nicht sehr günstig ist. Ich habe anstelle der üblichen Groß/Kleinschreibung überall einen Unterstrich gesetzt, anstelle eines Großbuchstabens, nur um keinen sinnlosen Eintrag zu erzeugen. ...

Du kannst den Programmcode stattdessen mit <nowiki></nowiki> umschließen.


KategorieWiederverwendung


StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 25. April 2006 13:03 (diff))
Suchbegriff: gesucht wird
im Titel
im Text