7

行動心理学のパラダイムを実行するために、MATLAB でPsychtoolboxを使用しています。パラダイムの一部として、ユーザーは視覚刺激を表示し、何らかの入力メカニズムを使用してそれに応答する必要があります。キーボードの場合、これは次のように機能します。

  1. 刺激を見せる
  2. 応答のためにキーボードをポーリングする
    1. 応答が検出されない場合は、1 にループバックします
    2. 応答が検出された場合は、スクリプトを中断して次に進みます

ステップ 2 には 1 ~ 2 ミリ秒かかるため、これはキーボードでは問題なく機能します。別の入力メカニズムを使用すると問題が発生します。その場合、ステップ 2 には約 20 ミリ秒かかります。(研究を実行するには、この代替入力が必要であり、それは不変の事実と見なされるべきです。) 非常に短い期間で刺激が変化するため、追加された遅延によりタスクが中断されます。

私の現在の考えは、1 つのスレッドが刺激を表示し、別のスレッドがキーボードをポーリングするように、並列処理を使用しようとすることです。現在、これを行うためにParallel Computing Toolboxを使用しています。私が抱えている問題は、キーボード入力を「並列化された」スレッドに送る方法がわからないことです。(1)キーボード入力をスレッドに直接送信できるかどうか/スレッドに視覚信号をモニターに送信させることができるかどうか、また可能であれば(2)その方法を知っている人はいますか?

また、この問題にどのようにアプローチするかについて誰かがより良いアイデアを持っている場合は、私はすべて耳を傾けます.

4

3 に答える 3

4

この MATLAB ニュースグループのスレッドによると、スレッドはグラフィックス オブジェクトを変更できないようです。デスクトップ MATLAB クライアントのみがこれを行うことができます。これは、スレッドからのグラフィックスの更新を処理できないことを意味します。私が試してみたところ、スレッドから図やルート オブジェクトを変更することさえできなかったので、これを確認できます。

ただし、スレッドが入力のポーリングを処理している間に、MATLAB でメインのグラフィック更新を行うことができると思います。以下は、入力を待っているスレッドのKbCheck実行が終了するまでディスプレイを継続的に更新するサンプル関数です。

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

上記の関数をいくつかの単純なプロット ルーチンで正常に実行し、コードをget_input単純な一時停止ステートメントと戻り値に置き換えることができました。スレッドで機能するかどうかKbCheckはわかりませんが、これをニーズに合わせて調整できることを願っています.

上記のコードで使用されている Parallel Computing Toolbox 関数のドキュメントは次のとおりです: createJobcreateTasksubmit、。waitForStatedestroy

于 2010-12-10T16:55:34.133 に答える
2

並列処理でこれを行う方法がわかりません。

ただし、使用できる可能性がある機能はタイマー オブジェクトです。入力メカニズムをポーリングするようにタイマー オブジェクトを設定し、何かが検出された場合は、グローバル変数の値を変更します。次に、刺激ルーチンを開始します。表示を更新している while ループでは、タイマー オブジェクトからの変更についてグローバル変数をチェックし続けます。

于 2010-12-10T16:23:10.833 に答える
-2

入力デバイスの 20 ミリ秒の遅延に取り組む必要があります。遅すぎる場合は、別の入力デバイスを入手してください。適切な応答ボックスを使用すると、ミリ秒未満の良好なタイミングを得ることができます。

スレッドに関するこの話はすべて見当違いであり、PTB フレームワークには当てはまりません。

于 2011-02-09T18:39:53.213 に答える