Question

J'utilise Psychtoolbox Matlab pour exécuter un paradigme de la psychologie comportementale. Dans le cadre du paradigme, les utilisateurs doivent voir un stimulus visuel et de répondre à l'aide d'un mécanisme d'entrée. Pour un clavier, cela fonctionne comme suit:

  1. stimulus show
  2. clavier scrutin pour la réponse
    1. si aucune réponse détectée, le dos de la boucle de 1
    2. si la réponse détectée, pause et passer avec le script

Cela fonctionne bien pour un clavier, comme à l'étape 2 prend entre 1-2 ms. Le problème vient quand j'utilise un mécanisme d'entrée alternatif; dans ce cas, l'étape 2 a ~ 20 ms. (J'ai besoin de cette entrée alternative pour lancer l'étude, et qui devrait être considéré comme fait immuable.) Comme le stimulus change avec un laps de temps très court, ce retard ajouté rompt la tâche.

Ma pensée actuelle est d'essayer d'utiliser le traitement parallèle, de telle sorte que l'un fil montre le stimulus, et un autre sondages de fil du clavier. J'utilise actuellement Parallel Computing Toolbox pour le faire. Le problème que je vais avoir est que je ne sais pas comment diriger l'entrée du clavier à un fil « paralléliser ». Quelqu'un sait-il (1) s'il est possible d'entrée du clavier direct à un fil / ont un fil envoyer un signal visuel à un moniteur, et si oui, (2) comment le faire?

En outre, si quelqu'un a une meilleure idée quant à la façon d'aborder ce problème, je suis toutes les oreilles.

Était-ce utile?

La solution

Selon ce fil de newsgroup Matlab, il semble que les discussions ne peuvent pas modifier des objets graphiques. Seul le client de bureau Matlab peut le faire. Cela signifie que vous ne pouvez pas gérer la mise à jour des graphiques à partir d'un fil, et je peux confirmer ce que je l'ai essayé et n'a pas été en mesure de modifier les chiffres ou même le objet racine à partir d'un fil.

Cependant, je pense que vous pourriez être en mesure de faire les principaux éléments graphiques de mise à jour en Matlab alors qu'un poignées de fil polling pour votre entrée. Voici une exemple de fonction de mise à jour en permanence un affichage jusqu'à ce qu'un fil d'attente pour l'entrée de KbCheck est en marche fini:

function varargout = plot_until_input

  obj = createJob();                                   %# Create a job
  task = createTask(obj,@get_input,4,{deviceNumber});  %# Create a task
  submit(obj);                                         %# Submit the job
  waitForState(task,'running');  %# Wait for the task to start running

  %# Initialize your stimulus display here
  while ~strcmp(get(task,'State'),'finished')  %# Loop while the task is running
    %# Update your stimulus display here
  end

  varargout = get(task,'OutputArguments');  %# Get the outputs from the task
  destroy(obj);                             %# Remove the job from memory

%#---Nested functions below---

  function [keyIsDown,secs,keyCode,deltaSecs] = get_input(deviceNumber)
    keyIsDown = false;
    while ~keyIsDown  %# Keep looping until a key is pressed
      [keyIsDown,secs,keyCode,deltaSecs] = KbCheck(deviceNumber);
    end
  end

end

J'ai été en mesure d'exécuter avec succès la fonction ci-dessus avec quelques simples routines de traçage et de remplacer le code get_input avec un simple pause déclaration et une valeur de retour. Je ne suis pas sûr que KbCheck fonctionnera dans un fil, mais nous espérons que vous pourrez l'adapter à vos besoins.

Voici la documentation pour les fonctions Parallel Computing Toolbox utilisées dans le code ci-dessus: createJob , createTask , submit , waitForState , destroy .

Autres conseils

Je ne sais pas d'une manière dont vous pouvez le faire avec le traitement parallèle.

Cependant, une fonctionnalité que vous pourriez être en mesure d'utiliser est l'objet de la minuterie . Vous définissez l'objet de minuterie pour interroger le mécanisme d'entrée, et, si quelque chose est détecté, modifiez la valeur d'une variable globale. Ensuite, vous commencez votre routine de relance. Dans la boucle while dans lequel vous mettez à jour l'affichage, vous gardez le contrôle de la variable globale pour un changement de l'objet de la minuterie.

Vous devez attaquer la latence de 20 ms dans votre périphérique d'entrée. Si elle est trop lent alors obtenir un autre périphérique d'entrée. Vous pouvez obtenir un bon timing sous-milliseconde avec des boîtes de réponse appropriées.

Tous ces discours sur le filetage est mal orienté et non applicable au cadre de TBP.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top