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?
2
A
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.
Questions connexes
- 1. Scrolling UIScrollView - bloc thread principal
- 2. Renouvelez le thread principal?
- 3. Python multithreading - bloc de thread principal socket.connect
- 4. webViewDidFinishLoad bloque le thread principal
- 5. AudioServicesPlaySystemSound et le thread principal
- 6. Thread.join bloque le thread principal
- 7. Le bloc Queue.get est-il principal?
- 8. Exécuter le rappel sur le thread principal
- 9. Exception dans le thread "principal" java.lang.ArrayIndexOutOfBoundsException: 0
- 10. Exception dans le thread "principal" java.lang.NoClassDefFoundError
- 11. Exception dans le thread "principal" java.lang.NoSuchMethodError
- 12. Fermeture de l'exécution sur le thread principal
- 13. NSInvocationOperation et thread principal
- 14. FileIO - Exception dans le thread « principal » NullPointerException
- 15. Pourquoi cela fonctionne-t-il sur le thread principal?
- 16. Pourquoi ASINetworkQueue et ASIHTTPRequest bloquent le thread principal?
- 17. Pourquoi UITableView ne rechargeait (même sur le thread principal)?
- 18. Utilisation du thread principal
- 19. std :: thread détecter thread principal
- 20. NSOperation et NSNotificationCenter sur le thread principal
- 21. Exception dans le thread "principal" java.lang.NoSuchMethodError: principale
- 22. Textureview.getBitmap() rendant le thread Ui principal lent
- 23. iOS AudioSessionSetActive() bloquant le thread principal?
- 24. Exception dans le thread "principal" erreur java.lang.NullPointerException
- 25. Java: Exception dans le thread "principal" java.lang.NoClassDefFoundError
- 26. Exception dans le thread "principal" java.lang.NullPointerException InputStreamReader
- 27. obtenir Exception dans le thread « principal » java.lang.NoClassDefFoundError:
- 28. Exception dans le thread "principal" java.lang.NullPointerException (JDBC)
- 29. Appel d'une méthode sur le thread principal?
- 30. Exception dans le thread "principal" java.lang.NullPointerException
Pouvez-vous prendre des dispositions pour être averti lorsque la tâche est terminée? –
Répondu ci-dessus. – gabr
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. –