1

Visual Studio 2010 で Windows ベースのアプリケーションを作成しています。ホスト PC は 2 台の Canon EOS 600D に接続されています。これまでのところ、私は 2 枚の写真を撮り、それを (SD カードなしで) ホスト PC に直接ダウンロードし、その写真を特定の名前でホストに保存しました。コードをループで実行すると、正常に動作します (ループのインデックスはカメラと宛先ファイルを指定します)。次のステップでは、OpenMP2.0 を使用してループを高速化しました (これは OpenMP を使用した最初のプロジェクトです)。写真は同時に撮影されますが、残念ながら両方の写真は、各タスクの対応するメッセージ ループではなく、同じメッセージ ループ (カメラ 0 またはカメラ 1) によって処理されます。その結果、カメラ バッファからの画像は同じファイルに保存されます。

誰かがこの問題を取り除く方法を知っていれば、それは素晴らしいことです. 私の観点からの最も好ましい解決策は、どのスレッド/カメラから写真が撮影されたかをメッセージ ループに伝えることです (1 つで十分であることがわかったため)。Mutex を使用するとアルゴリズムが遅くなるため、Mutex の使用を避けることができれば、それも素晴らしいことです。

これまでのところ、これは私のイベント ハンドラーです。動作しますが、threadNo を見つける必要があります。

EdsError EDSCALLBACK fHandleObjectEvent( EdsObjectEvent event,EdsBaseRef object,EdsVoid * context){
  if(event){fDownloadImage(object,threadNo}
  /// Object must be released
  if(object){EdsRelease(object);}
  return EDS_ERR_OK;
}

そして私の主な機能

int main(int argc, char** argv){
  #pragma omp parallel for
  for(int ii=0;ii<2;ii++){
    fTakePicture(ii);
  }
  return 0;
}

前もって感謝します。

編集1: Windowsメッセージループを無効にすると(引用する)、プログラムが次の動作を示すことがわかりました。

1 回目の実行: 2 枚の写真を撮る

2 回目の実行: 前の実行から 2 つの写真をダウンロードし、2 つの新しい写真を撮ります。

そのため、スレッド番号とメッセージは何らかの方法で保存され、実行後も存続し、次の実行時にリロードされるようです (メイン ウィンドウが破棄されているかどうかは関係ありません)。だから、正しい順序でそれを取得する必要があります。

編集 2:適切に動作するように見える解決策を見つけました。kEdsPropID_BodyIDExカメラ本体のシリアル番号で解決しましたが、Canon EDSDK Version 2.12 で機能が無効になっているため、Canon EDSDK Version 2.11.3 に戻す必要がありました。これが他のユーザーが同様のタスクを解決するのに役立つことを願っています.

乾杯TL

4

2 に答える 2

0

コールバックの「コンテキスト」パラメーターを使用して、2 つのカメラを区別する必要があります。EdsSetObjectEventHandler でコールバックを登録するときに、各カメラの一意の値を最後のパラメーターとして渡すだけです。

于 2013-12-02T01:48:40.463 に答える