Comment passer des paramètres à un objet Thread?
Je travaille avec une classe C++-bibliothèque qui fournit un Fil de la classe de base où l'utilisateur doit
mettre en œuvre un run()
méthode.
Est-il recommandé de façon sur la façon de passer des paramètres à cette run()
méthode? Dès maintenant
Je préfère passer par le constructeur (à titre indicatif).
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr que le C++, mais c'est la façon dont vous le feriez en Java. Vous auriez une classe qui étend la classe Thread (ou implements Runnable) et un constructeur avec paramètres que vous souhaitez passer. Ensuite, lorsque vous créez le nouveau thread, vous devez passer dans les arguments, et puis commencer le fil, quelque chose comme ceci:
Doit être le même dans votre cas.
Une alternative est d'étendre cette classe Thread à accepter un foncteur comme unique paramètre du constructeur, de sorte que vous pouvez lier à l'appel à l'intérieur.
La classe à l'aide de threads n'aurez pas besoin d'hériter de Fil, mais seulement en avez un (ou plusieurs) Thread membre. Le foncteur des appels tout point de départ que vous souhaitez ( une méthode de la classe avec tous les paramètres )
Ici est un modèle typique:
1) Définir une structure de données qui encapsule toutes les données de votre fil besoins
2) Dans le thread principal, instancier une copie de la structure de données sur le tas à l'aide de l'opérateur new.
3) Remplir la structure des données, la fonte le pointeur de type void*, passer le void* pour la procédure de thread par tous les moyens qui vous sont fournis par votre bibliothèque de threads.
4) Lorsque le thread obtient le void*, il reinterpret_cast est-il de la structure de données, et prend alors possession de l'objet. Sens quand le fil est fait de ces données, le thread libère, en comparaison avec le thread principal de la désallocation il.
Voici un exemple de code, vous pouvez compiler & test de Windows.
Un problème commun avec le fil de démarrage est que les arguments passés existent uniquement sur la pile dans l'appel de la fonction. Fil de démarrage est souvent différé, tels que l'appel de la fonction retourne et il est à seulement quelques temps plus tard, le fil commence et le moment venu, les arguments ne sont plus dans l'existence.
Une solution à ce problème est de créer un événement, puis démarrer le thread, en passant de l'événement comme l'un des arguments. Le départ de la fonction attend alors l'événement, qui est signalée par le fil quand il a terminé de démarrage.
Vous pouvez passer les paramètres en tant que membres de la classe thread. Le fil qui crée le thread peut sans doute appeler d'autres méthodes et/ou d'appeler des fonctions de membre avant la discussion commence. Par conséquent, il est possible de remplir ce que les membres sont nécessaires pour que cela fonctionne. Puis, lorsque la méthode est appelée, elle aura toutes les informations nécessaires pour le démarrage.
Je suis en supposant que vous utilisez un objet distinct pour chaque thread.
Vous auriez normalement mettre tous les fils que vous créez dans un tableau, vecteur, etc.
C'est ok pour les transmettre via le constructeur. Juste être sûr que les pointeurs vivent plus longtemps que le thread.
Bien, je préfère mettre les paramètres dans la méthode Start (), de sorte que vous pouvez avoir protégé constructeur, et n'ont pas à mettre en cascade les paramètres par le biais de constructeur de classe dérivée.
Je serais pro que mon decleration ressembler à quelque chose comme ceci:
Assurez-vous que vos paramètres sont en quelque sorte contracté, par exemple #1 sera de type int, n ° 2 sera un double etc. etc. 🙂