: Du kannst den Programmcode stattdessen mit <nowiki></nowiki> umschließen. |
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);