2013-06-02 2 views
2

En utilisant OmniThreadLibrary et Delphi XE4, j'espère pouvoir exécuter plusieurs threads qui traitent les données en arrière-plan, ajoutant ainsi de la vitesse à mon code déjà existant. Lorsque vous appelez la procédure ci-dessous, l'interface graphique de l'application arrête de traiter toute entrée jusqu'à ce que tous les threads soient terminés. Ma compréhension est que l'utilisation de .NoWait devrait permettre à la procédure de se terminer même lorsque les threads sont en cours d'exécution. Est-ce que ma compréhension de la boucle ForEach est incorrecte, suggérant que je devrais utiliser une autre méthode pour réaliser le traitement en arrière-plan? Toutes les suggestions sur l'utilisation correcte de la bibliothèque OmniThread sont appréciées.Pourquoi le bloc principal d'OmniThreadLibrary bloque-t-il le thread principal?

Répondre

10

Vous devez stocker l'interface renvoyée par Parallel.ForEach dans une variable globale (forme, etc.) et la détruire uniquement lorsque ForEach termine l'exécution.

Dans votre exemple, le résultat de ForEach est stocké dans une variable temporaire qui est détruite lorsque la procédure de test se termine. Le destructeur ForEach attend que toutes les tâches se terminent et bloque votre programme.

La méthode la plus sûre (mais non évidente) pour détruire l'interface foreach à la fin de la tâche est d'utiliser la méthode OnStop et d'en faire la queue dans le thread principal.

var 
    loop: IOmniParallelLoop<integer>; 

loop := Parallel.ForEach(1, N).NoWait; 
loop.OnStop(
    procedure (const task: IOmniTask) 
    begin 
    task.Invoke(
     procedure 
     begin 
     // do anything 
     loop := nil; 
     end); 
    end); 
loop.Execute(
    procedure (const value: integer) 
    begin 
    ... 
    end); 

Ceci est documenté dans the wiki.

+1

Pouvez-vous prendre des dispositions pour être averti lorsque la tâche est terminée? –

+0

Répondu ci-dessus. – gabr

+1

Merci. C'était plus une question pour ma propre éducation, voyant comme je t'avais à mon appel! ;-) Mais je suppose que le demandeur pourrait bien se demander la même chose. –

Questions connexes