2011-02-13 5 views
3

J'ai une preuve d'une condition de course [Note: voir la mise à jour ci-dessous] dans un programme Actionscript 3 (AS3) dans laquelle un certain objet a des méthodes invoquées:Actionscript 3 (AS3) modèle de la concomitance

  1. Quand gère les événements de téléchargement asynchrone
  2. a partir d'un script ajouté à une image dans le scénario d'un MovieClip

Quel est le modèle d'accès concurrentiel en AS3? La gestion des événements est-elle sérialisée (c'est-à-dire que chaque gestionnaire s'exécute pour un événement après l'autre, malgré tout le multithreading sous-jacent)? Et les scripts dans les cadres sont-ils sérialisés avec ce flux d'événements? Je soupçonne que la réponse à cette dernière question est négative.

Je prends des mesures pour consigner systématiquement si/quand une condition de concurrence se produit mais il serait bon de savoir quelles garanties (le cas échéant) AS3 fournit.

MISE À JOUR: Je l'ai fait une simple vérification dans mes gestionnaires d'événements pour enregistrer si un gestionnaire d'événements était déjà en cours de traitement sur l'objet d'intérêt particulier et je trouve que ce -t se produit, à savoir les conditions de course sont possibles. Est-ce que quelqu'un d'autre a rencontré cela et qu'avez-vous fait à ce sujet ?!

Répondre

0

There is no "real" concurrency in Flash - tout, y compris la gestion des événements, est cadencé par le scénario principal. Toutes vos opérations sont certaines à exécuter dans l'ordre exact spécifié dans le code.

Mais bien sûr, des problèmes peuvent survenir si vous basez le résultat d'un bloc "d'origine asynchrone" (je vais utiliser ce terme, bien que ce ne soit pas tout à fait correct au sens strict) sur le résultat de un autre - ce qui peut être le cas lors de l'utilisation de gestionnaires d'événements. Vous devrez trouver un moyen de résoudre vous-même ces problèmes par programme; il n'y a pas de construction intégrée comme synchronisée ou atomique, pas de threads et de verrouillage, ou tout autre mécanisme similaire dans ActionScript.

Il existe des moyens de simuler le multithreading dans Flash, et this tutorial pourrait être un moyen intéressant de commencer votre recherche de solution, car il explique certains concepts sous-jacents.

+1

effectivement il y a maintenant –

+1

Yup. Ouvriers. Allez-y et écrivez une réponse plus à jour! – weltraumpirat

0

Il comme dans une application multi-thread est seulement un fil que votre code AS3 peut fonctionner dans.

Les conditions de course sont possibles dans les gestionnaires d'événements asynchrones, mais pas dans le même sens, et sont généralement plus faciles à traquer. Par exemple, vous pouvez lancer une animation et charger un fichier en même temps. Le premier achevé est complètement dépendant du système.

Un autre exemple, qui n'est pas vraiment une condition de concurrence, mais qui a un symptôme similaire, est l'endroit où vous utilisez une boucle for..in (ou for..each) pour ajouter plusieurs écouteurs pour le même événement. Les auditeurs recevront l'événement dans l'ordre dans lequel ils ont été ajoutés, mais la boucle for..in est aléatoire, de sorte que vous verrez des résultats aléatoires.