OpenSesame
Rapunzel Code Editor
DataMatrix
Support forum
Python Tutorials
MindProbe
Supported by

Faire les choses en parallèle

Les coroutines exécutent plusieurs éléments en parallèle, ou, pour être plus précis, elles exécutent des éléments en rapide alternance d'une manière qui semble parallèle. Tous les éléments ne prennent pas en charge les coroutines.

Utiliser des coroutines

Vous pouvez utiliser des coroutines grâce au plugin coroutines (voir Figure 1).

/pages/fr/manual/structure/img/coroutines/FigCoroutinesInterface.png

Figure 1. L'interface du plugin coroutines.

Comme vous pouvez le voir, le plugin coroutines ressemble à l'élément sequence, mais présente quelques options supplémentaires :

  • Duration indique la durée totale des coroutines.
  • End after item (optional) indique que les coroutines doivent se terminer lorsqu'un élément spécifique est terminé. Cela vous permet, par exemple, d'indiquer que les coroutines doivent se terminer lorsqu'une touche a été recueillie, en sélectionnant un élément keyboard_response ici.
  • Chaque élément a un Start time. La plupart des éléments ont également un End time. Le temps de fin ne s'applique pas aux éléments à tir unique; par exemple, les sketchpad affichent un écran et se terminent immédiatement, donc ils n'ont pas de temps de fin.

Plus précisément, l'exemple de Figure 1 (de l'exemple de tâche de signal d'arrêt) fait ce qui suit :

  • Il montre une cible immédiatement.
  • Si la variable stop_after n'est pas vide, il affiche l'écran stop_signal après un intervalle spécifié par la variable stop_after.
  • Pendant tout l'intervalle (2000 ms), une réponse au clavier est recueillie.

Le flux temporel est contrôlé par le plugin coroutines. Par conséquent, les valeurs de délai d'expiration et de durée spécifiées dans les éléments ne sont pas utilisées. Par exemple, dans Figure 1, le keyboard_response s'exécutera pendant 2000 ms, quel que soit le délai d'expiration spécifié dans l'élément.

Éléments pris en charge

Actuellement, les éléments suivants sont pris en charge (cette liste peut ne pas être exhaustive) :

  • feedback
  • inline_script
  • keyboard_response
  • logger
  • mouse_response
  • sampler
  • synth
  • sketchpad

Utiliser des éléments inline_script dans les coroutines

Lorsque vous utilisez un élément inline_script dans une coroutines, la phase Run fonctionne un peu différemment de ce à quoi vous pourriez être habitué. Plus précisément, la phase Run est exécutée à chaque itération des coroutines. De plus, la phase Run ne doit contenir que du code qui prend très peu de temps à exécuter ; en effet, les opérations longues bloqueront les coroutines, interférant ainsi avec le minutage des autres éléments des coroutines. Pour mettre fin aux coroutines, vous pouvez lever une exception AbortCoroutines().

Par exemple, disons que vous avez une coroutines avec deux éléments keyboard_response, kb1 et kb2, et que vous voulez exécuter les coroutines jusqu'à ce que deux touches aient été recueillies, avec un délai d'expiration de 5000 ms. Vous pourriez alors créer la structure coroutines suivante :

/pages/fr/manual/structure/img/coroutines/FigCoroutinesTwoResponses.png

Figure 2. Une coroutines qui recueille deux réponses par pression de touche

L'élément inline_script check_responses définira d'abord les deux variables de réponse sur une chaîne vide dans la phase de préparation :

# Ceci est exécuté au début des coroutines
response_kb1 = ''
response_kb2 = ''

Et ensuite, dans la phase Run, vérifiez si les deux variables ont été définies, et abandonnez les coroutines si c'est le cas :

# Les valeurs qui ne sont pas une chaîne vide sont vraies pour Python
# Ce code sera exécuté plusieurs fois !
if response_kb1 and response_kb2:
    raise AbortCoroutines()

Expressions run-if

Le comportement des expressions run-if dans les coroutines est un peu différent de celui des éléments sequence. Plus précisément, les expressions run-if dans les coroutines sont évaluées pendant la phase de préparation. Voir aussi :

Supported by