2009-10-02 9 views
4

Quelle est la meilleure solution pour permettre à un objet d'exécuter des méthodes sur un thread? L'objet est le propriétaire de TThread et le thread contient uniquement un TidHTTP (socket de blocage) pour publier la requête et analyser la réponse.Comment puis-je exécuter certaines commandes sur un thread séparé?

Exemple:

  • Objet> Exécuter demande sur le fil
  • Discussion> Envoyer demande par idHTTP, attendez une réponse, envoyer le résultat à l'objet
  • Discussion> Attendez une autre demande
  • Objet> Mise à jour de l'interface utilisateur en fonction du résultat de la demande

Répondre

4

Une manière relativement sûre de communiquer avec reads utilise des files d'attente de commandes. L'objet publie une requête dans la file d'attente (en utilisant des sémaphores).

  • La bande de roulement vérifie la file d'attente (en utilisant des sémaphores) et si elle est remplie, elle exécute la requête la plus ancienne (vous pouvez introduire des priorités si vous le souhaitez).
  • Si la tâche est terminée, l'objet est signalé (par exemple avec une fonction de rappel).

Le thread dort normalement et ne se réveille que pour vérifier la file d'attente. S'il n'y a rien à faire, il "appuie sur le bouton snooze" et dort à nouveau.

Veillez à protéger l'accès à la file d'attente avec des sémaphores. Sinon, il y a une chance de corruption de données et vous avez un bug difficile à trouver.

+0

Merci pour votre réponse :) – Ariel32

0

Je ne connais pas le "meilleur" - cela dépend de vos critères. Si vous développez un peu vos besoins, nous pourrions peut-être vous offrir une aide plus spécifique. Entre-temps ...

La méthode la plus simple consiste à autoriser l'objet propriétaire à écrire la requête sur le thread, soit dans une ou plusieurs propriétés, soit par une méthode publique. Les champs de données derrière les propriétés/méthodes ne sont pas directement accessibles par la routine principale Execute: utilisez une méthode appelée par Synchronize() pour copier ces champs de données dans des variables qui peuvent être utilisées par la routine Execute(). J'utilise cette méthode lorsque la vitesse n'est pas l'objectif principal et que l'objet propriétaire n'a pas besoin de mettre en file d'attente plusieurs demandes.

Beaucoup de gens dénigrent en utilisant Synchroniser, mais cela dépend de la fonctionnalité que vous essayez d'atteindre. J'essaie de garder les choses simples jusqu'à ce que les exigences exigent le contraire.

Si le débit est plus important ou si vous avez besoin de chevaucher des demandes, vous pouvez utiliser une file d'attente pour stocker les demandes, avec un accès à la file d'attente contrôlée par un TCriticalSection. Vous pouvez également utiliser TThreadList, directement ou en tant que base pour votre propre stockage typé - je ne suis pas au courant d'un équivalent générique de TThreadList, bien qu'il puisse y en avoir un.

+0

Merci pour votre aide! J'ai besoin d'utiliser une file d'attente pour stocker la requête et le thread peut seulement exécuter une requête en même temps.Je ne peux pas générer plus de thread qui utilisera le même idHTTP donc même si toutes les requêtes sont indépendantes, elles doivent être exécutées une par une seulement. L'application sur laquelle je travaille est plus expliquée sur ce post: http://stackoverflow.com/questions/1506212/complex-software-architecture – Ariel32

1

Une autre méthode, qui mérite d'être mentionnée, est d'utiliser Async Calls par Andreas Hausladen. C'est un wrapper de thread simple à utiliser et bien écrit qui fonctionne très bien dans un environnement fonctionnel.

Questions connexes