Question

Existe-t-il une documentation sur la communication inter-thread dans Delphi? Comment puis-je envoyer un message au fil qui n'a pas de fenêtre?

Était-ce utile?

La solution

Vous pouvez uniquement envoyer des messages (Windows) aux threads qui implémentent une boucle de message standard, qui sera automatiquement créée dès qu'un descripteur de fenêtre est créé.

Il n’est cependant pas nécessaire d’utiliser des messages pour communiquer avec un thread. Laissez-le simplement patienter sur un objet événement (TEvent dans la VCL) et signalez cet événement lorsque vous souhaitez que le thread exécute une fonction.

Mais si vous débutez dans le multi-threading, n'entrez pas seul dans tous ces détails, à moins que vous ne vouliez l'effet d'apprentissage. Utilisez simplement la OmniThreadLibrary pour en finir. Il y a beaucoup à apprendre en creusant dans ses composants internes, une fois que vous savez comment vous en servir.

Modifier:

Voir aussi les réponses à cette question qui est très similaire.

Modifier 2:

À propos du commentaire demandant "Qu'est-ce que [OmniThreadLibrary] facilite, et à quel coût?" Je ne peux que vous conseiller de vérifier par vous-même - c'est-à-dire si vous utilisez au moins Delphi 2007. Il existe plusieurs exemples pour illustrer les concepts, mais pour un rapide "real-life". Vous pouvez par exemple consulter cet article de blog - vous n’avez même pas besoin d’installer la bibliothèque pour cela.

Je conviens également que l’utilisation d’une bibliothèque pour le multi-threading nécessite un certain acte de foi. OTOH se contenter de ce que fournit la VCL n’est guère une alternative. L'exemple de code utilise toujours l'appel mal conçu de Synchronize (). Il n'y a pas de support pour des choses telles que les files d'attente producteur-consommateur-thread-safe, qui sont beaucoup plus adaptées à la programmation multi-thread. Et si vous êtes d’accord pour dire que vous avez besoin d’un fondement plus solide pour vos programmes multithreads que ce que la VCL fournit, pourquoi réinventer cette roue?

En ce qui concerne le coût d’utilisation de la bibliothèque: vous devrez déterminer vous-même s’il est assez rapide. Cela résume bien la communication entre les threads à mon humble avis, mais chaque abstraction coûte évidemment de la performance.

Si vous décidez que ce n’est pas pour vous après tout, écrivez le code vous-même. J'ai fait la même chose pour Delphi 4 et j'utilise ce code depuis près de 10 ans maintenant. Et à en juger par le nombre de bugs que j'ai trouvés et les cas critiques que j'ai rencontrés à cette époque, je conseillerais certainement à toute personne novice dans le multi-threading de ne pas écrire son propre code de bibliothèque. Et si vous le désirez vraiment , veuillez suivre les règles décrites dans cette annonce à coeur.

Autres conseils

La question La boucle de messages multi-threading de Delphi contient également quelques exemples. de communication entre les threads

Si vous avez une référence à l'objet thread, vous pouvez simplement l'appeler directement et demander à la procédure de stocker les informations ou de les mettre à jour en conséquence. Évidemment, vous devez faire attention à ne pas faire de trucs avec le fil.

Vous pouvez également utiliser un objet de contrôle central via lequel les threads communiquent lorsqu'ils ne sont pas occupés. J'ai une application où les threads ont des objectifs particuliers et se voient attribuer un ID de thread. N'importe quel fil peut " poster " un message avec un identifiant de message et une chaîne de paramètres vers un autre identifiant de thread puis poursuivant son travail. L’autre fil la prend à sa guise et agit en conséquence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top