Frage

Ich bin mit Psychtoolbox in MATLAB eine Verhaltenspsychologie Paradigma laufen. Im Rahmen des Paradigmas hat Anwender einen visuellen Reiz und reagiert auf sie sehen einig Eingabemechanismus verwenden. Für eine Tastatur, das funktioniert wie folgt:

  1. zeigen Stimulus
  2. Umfrage-Tastatur für die Antwort
    1. , wenn keine Antwort erfaßt wird, Schleife zurück zu 1
    2. Wenn Antwort erfaßt, Pause und bewegen Sie sich mit Skript

Dies funktioniert gut für eine Tastatur, wie in Schritt 2 zwischen 1-2 ms dauert. Das Problem kommt, wenn ich einen alternativen Eingabemechanismus verwenden; in diesem Fall Schritt 2 dauert ~ 20 ms. (Ich brauche diese alternative Eingabe, die Studie zu laufen, und das sollte unveränderlich Tatsache in Betracht gezogen werden.) Als der Reiz mit einer sehr kurzen Zeitspanne ändert, muss diese zusätzliche Verzögerung bricht die Aufgabe.

Mein aktueller Gedanke ist, zu versuchen, die Parallelverarbeitung zu verwenden, so dass ein Thread zeigt den Reiz, und ein anderer Thread fragt die Tastatur. Ich bin derzeit mit der Computing Toolbox Parallel dies zu tun. Das Problem, das ich habe ist, dass ich weiß nicht, wie die Tastatureingabe an einen „parallelisiert“ Thread zu lenken. Wer weiß (1), ob es möglich ist, um direkte Tastatureingabe zu einem Thread / haben einen Thread ein visuelles Signal an einen Monitor senden, und wenn ja, (2), wie es zu tun?

Auch wenn jemand eine bessere Idee, wie dieses Problem zu nähern, bin ich ganz Ohr.

War es hilfreich?

Lösung

Nach dieser MATLAB Newsgroup-Thread , scheint es, dass Threads kann nicht Grafikobjekte ändern. Nur das Desktop-Client MATLAB tun. Dies bedeutet, dass Sie nicht die Aktualisierung von Grafiken aus einem Thread verarbeiten können, und das kann ich bestätigen, wie ich es ausprobiert und war nicht in der Lage Zahlen zu ändern oder sogar die Stammobjekt aus einem Thread.

Aber ich denke, Sie in der Lage sein, die wichtigste Grafik Aktualisierung in MATLAB, während ein Thread-Handles Polling für Ihre Eingabe zu tun. Hier ist eine Beispielfunktion zur kontinuierlichen Herstellung einer Anzeige, bis ein Thread Aktualisierung für die Eingabe wartet von KbCheck ist fertig läuft:

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

Ich konnte die obige Funktion mit einigen einfachen Plotten Routinen und Ersetzen Sie den Code in get_input mit einem einfachen Pause Anweisung und einen Rückgabewert. Ich bin nicht sicher, ob KbCheck in einem Thread funktionieren wird, aber hoffentlich können Sie diese für Ihre Bedürfnisse anpassen zu können.

Hier ist die Dokumentation für die Parallel Computing Toolbox-Funktionen in dem obigen Code verwendet: createJob , createTask , submit , waitForState , destroy .

Andere Tipps

Ich weiß nicht, von einer Art und Weise, wie Sie dies mit dem parallelen Bearbeitung tun könnten.

Allerdings ist eine Funktion, die Sie verwenden können, könnten, ist das Timer-Objekt . Sie würden das Timer-Objekt eingerichtet, um den Eingabemechanismus abzufragen, und, wenn überhaupt erkannt wird, den Wert einer globalen Variablen ändern. Dann können Sie Ihre Reiz Routine starten. In der while-Schleife, in der Sie die Anzeige aktualisieren, halten Sie die globale Variable für einen Wechsel von dem Timer-Objekt zu überprüfen.

Sie haben die 20ms zu bewältigen Latenz in Ihrem Eingabegerät. Wenn es zu langsam ist dann ein anderes Eingabegerät erhalten. Sie können gutes Sub-Millisekunden-Timing mit dem richtigen Antwort Boxen erhalten.

All dieses Gerede über Threading ist falsch und nicht für den PTB-Framework.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top