2010-10-07 6 views
1

J'ai un thread qui fait une requête WMI pour moi et j'ai besoin d'accéder à certaines variables dans le thread après avoir exécuté la requête.Delphi accès aux variables de thread

Le fil est créé comme suit ...

procedure TFormMain.RunThread; 
var 
    WMIQ: TThreadWmiQuery; 
begin 
    WMIQ := TThreadWmiQuery.Create(True); 
    ... 
    WMIQ.OnTerminate := WMIQThreadOnTerminate; 
    WMIQ.Resume; 
end; 

et en cas OnTerminate je reçois les valeurs dont j'ai besoin comme si ...

procedure TFormMain.WMIQThreadOnTerminate(Sender: TObject); 
begin 
    Opcd := TThreadWmiQuery(Sender).P4COpcd; 
    Role := TThreadWmiQuery(Sender).P4CRole; 
    Usnm := TThreadWmiQuery(Sender).P4CUsnm; 
end; 

On m'a dit que ce peut-être pas le meilleur moyen d'accéder aux variables de thread. Existe-t-il d'autres moyens, mieux, d'obtenir facilement des données de mon fil sans trop de complexité?

Cordialement, Pieter

+0

Mieux dans quel sens? – himself

+0

Mieux vaut «faire les choses comme il faut». Je vois cependant à partir des réponses jusqu'à présent qu'il n'y a rien de mal avec la méthode que j'emploie actuellement. Merci pour toutes les réponses. Cordialement, Pieter. –

Répondre

4

Qui vous a dit ça? Ont-ils donné des raisons? OnTerminate est là pour interroger une instance de thread une fois qu'elle a fini d'être exécutée et avant qu'elle ne soit détruite.

En fait, lorsque vous définissez FreeOnTerminate de TThread sur True, vous n'avez aucun autre endroit pour accéder aux variables du thread.

Autres mécanismes:

  • variables globales définies par le fil, ailleurs interrogés: beurk et vous auriez encore besoin d'utiliser OnTerminate savoir quand le fil est terminé. Mieux vaut conserver les variables locales au thread lui-même. En utilisant PostThreadMessage à partir du thread: mais où publier? Cela signifierait laisser le fil savoir à qui poster ce message et donc une sorte de mécanisme d'observateur.

Le premier que je ne recommanderais pas. Le deuxième IMHO est exagéré si vous avez juste besoin d'interroger quelques valeurs à la fin du thread.

1

Je ne vois aucun problème avec cette approche. Le seul endroit où vous stockez une référence à l'objet thread se trouve dans une variable locale. L'objet thread est donc inaccessible pendant son exécution. C'est bon; cela signifie que rien ne peut accéder aux propriétés publiques ou aux champs du thread tant que le thread n'a pas fini de calculer leurs valeurs.

Assurez-vous de libérer l'objet thread quelque part. Vous pouvez le faire en définissant sa propriété FreeOnTerminate dans son constructeur.

+0

Merci.Je place toujours le FreeOnTerminate dans le constructeur du thread. P. –

1

Je ne vois rien de mal dans votre code, où il n'est pas nécessaire de l'améliorer. Mais si vous voulez toujours l'améliorer, notez que le code TThread.OnTerminate est exécuté dans le contexte du thread principal en utilisant TThread.Syncronize. Cela signifie que votre WMIQThread entre dans un état d'attente, dort jusqu'à ce que le thread principal exécuté code TThread.OnTerminate, se réveille et se termine. Il n'y a pas besoin d'une telle synchronisation pour juste assigner des variables de threads, donc le code peut être amélioré, mais l'amélioration devrait être implémentée dans les méthodes TThreadWmiQuery.

Si vous ne voulez pas modifier l'implémentation de TThreadWmiQuery, laissez les choses telles quelles.

Questions connexes