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