Wie zum übergeben von Parametern an ein Thread-Objekt?
Arbeite ich mit einem C++ - Klassen-Bibliothek, die eine Thread-Basis-Klasse, wo der Benutzer hat, um
implementieren Sie eine run()
Methode.
Gibt es eine empfohlene Art und Weise, wie Parameter übergeben, die run()
Methode? Jetzt
Ich bevorzuge, Sie zu übergeben, die über den Konstruktor (als Zeiger).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir nicht sicher, über C++, aber das ist, wie Sie es tun würde, in Java. Sie haben eine Klasse, die Sie erweitert-Thread (oder implementiert Runnable) und einen Konstruktor mit den Parametern, die Sie gerne weitergeben. Dann, wenn Sie beim erstellen des neuen Threads, die Sie zu Durchlaufen haben, in den Argumenten, und starten Sie dann den Faden, so etwas wie dieses:
Muss gleich sein in deinem Fall.
Alternative besteht darin, diesen Thread-Klasse zu akzeptieren Funktor nur als Konstruktor-parameter, so dass Sie binden können, die keinen Aufruf drin.
Dann die Klasse mit threads, die Gewohnheit Erben von Thread, sondern nur eine (oder mehrere) Thread-Mitglied. Der Funktor ruft alle start-Punkt, den Sie möchten ( eine Methode von der Klasse mit Parametern )
Hier ist ein typisches Muster:
1) Definieren Sie eine Datenstruktur, die kapselt alle Daten, die der thread braucht
2) In der main-thread instanziieren Sie eine Kopie der Datenstruktur auf dem heap, der operator new.
3) Füllen Sie die Daten-Struktur, werfen die Zeiger auf void* übergeben Sie die leere* auf die thread-Prozedur durch, was bedeutet, Sie werden durch eine thread-Bibliothek.
4) Wenn der worker-thread ruft die void*, es reinterpret_cast ist es an die Daten-Struktur, und dann übernimmt den Besitz des Objekts. Also wenn der thread fertig ist mit den Daten, die thread es freigibt, im Gegensatz zu den Haupt-thread freigeben es.
Hier ist Beispiel-code, den Sie kompilieren können & testen Sie in Windows.
Einem gemeinsamen problem mit thread-Start ist, dass die übergebenen Argumente existieren, die nur auf den stack der aufrufenden Funktion. Thread-Start ist oft aufgeschoben, so dass die aufrufende Funktion zurückgibt, und es ist nur einige Zeit später wurde der thread eigentlich gestartet - durch die Zeit, die Argumente sind nicht mehr vorhanden.
Einer Lösung dies ist ein Ereignis zu erstellen, und starten Sie dann den Faden, vorbei an der Veranstaltung als eines der Argumente. Die Start-Funktion wartet dann auf das Ereignis, das ist, signalisiert durch den thread, wenn es abgeschlossen ist starten.
Können Sie die übergabe der Parameter als member der thread-Klasse. Der thread wird erstellt, der thread kann vermutlich andere Methoden aufrufen, und/oder call-member-Funktionen bevor der thread gestartet wird. Daher kann es Auffüllen, was auch immer die Mitglieder sind notwendig, damit es funktioniert. Dann, wenn die run-Methode aufgerufen wird, wird es die notwendigen Informationen, um zu starten.
Gehe ich davon aus, dass Sie ein eigenes Objekt für jeden thread.
Würden Sie normalerweise alle threads, die Sie erstellen in ein array, vector etc.
Ist es ok, Sie zu übergeben, die über Konstruktor. Nur sicher sein, dass der Zeiger wird länger Leben als der thread.
Gut, ich würde es vorziehen, setzen Sie die Parameter in der Start() Methode, so können Sie ein protected-Konstruktor, und nicht die Kaskade die Parameter durch abgeleitete Klasse den Konstruktor.
Ich würde prolly lassen, meine Unabhängigkeitserklärung in etwa so Aussehen:
Nur stellen Sie sicher, dass Ihre Parameter werden irgendwie vergeben, z.B. #1 int #2 wird ein doppelter etc. etc. 🙂