7

Pourquoi les éléments d'interface utilisateur doivent-ils toujours être créés/mis à jour à partir du thread d'interface utilisateur?Pourquoi les éléments d'interface utilisateur doivent-ils toujours être créés/mis à jour à partir du thread d'interface utilisateur?

Dans (presque?) Tous les langages de programmation les éléments d'interface utilisateur peuvent être accédés/modifiés en toute sécurité depuis le thread de l'interface utilisateur. Je comprends que c'est un problème d'accès et de synchronisation simultanés standard, mais est-ce vraiment nécessaire? Ce comportement est-il imposé par les langages de programmation ou par le système d'exploitation? Existe-t-il des langages de programmation dans lesquels cette situation est différente?

Répondre

9

Elle est imposée par l'infrastructure graphique, qui est souvent (mais pas toujours) fournie par le système d'exploitation.

Fondamentalement, tout rendre "correctement threadsafe" est inefficace. Bien qu'il soit difficile d'avoir à rappeler les threads de l'interface utilisateur, cela permet au thread d'interface lui-même de traiter les événements extrêmement rapidement sans avoir à se soucier du verrouillage.

+0

ne serait-il pas plus facile pour le cadre de faire le contrôle et de mobiliser l'appel lui-même au lieu de prendre le risque d'avoir quelqu'un qui l'appelle d'une manière dangereuse en premier lieu? le framework .Net aurait pu le faire pour nous au moins ... – ak3nat0n

+0

Je dirais non. Si vous appelez la propriété Texte d'une zone de texte, c'est un jeu rapide. Si vous poussez la manipulation sur le framework, * chaque appel * sera lié par cette pénalité, même si la majorité des mises à jour proviennent du thread d'interface utilisateur lui-même. – jasonh

+0

@zaladane: Je pense qu'il pourrait ne pas être si facile de déterminer (automatiquement) quand le code doit être exécuté sur le thread de l'interface utilisateur. Je préférerais une construction dans la langue (peut-être un peu comme le mot-clé dangereux) pour exécuter un morceau de code spécifique sur le Thread UI. Ce serait un peu plus facile à lire que le code Dispatcher. – Zyphrax

6

Il serait très coûteux (lent) de faire le toute l'interface utilisateur thread-safe. Il vaut mieux charger le programmeur de synchroniser dans l'occasion (relativement rare) qu'un thread doit mettre à jour l'interface utilisateur.

5

C'est parce que le cadre de l'interface utilisateur a été conçu de cette façon. Il est théoriquement possible de concevoir un framework d'interface utilisateur véritablement multithread, mais il est difficile d'éviter les blocages.

Graham Hamilton a écrit un bel article à ce sujet en référence à Swing, le framework Java UI principal.

Questions connexes