2013-05-06 55 views
1

我在Visual Studio 2010中編寫了一個基於Windows的應用程序。我的主機PC連接到兩臺Canon EOS 600D。到目前爲止,我管理了兩張照片,直接將其下載(不帶SD卡)到主機PC,並將照片以特定名稱存儲在主機上。如果我在循環中執行我的代碼,它也可以正常工作(循環的索引指定相機和目標文件)。在下一步中,我使用OpenMP2.0來加速循環(這是我使用OpenMP的第一個項目)。現在照片是同時拍攝的,但不幸的是,兩張照片都由相同的消息循環(相機0或相機1)處理,而不是每個任務的相應消息循環。結果,來自相機緩衝區的圖像被存儲在相同的文件中。Canon SDK:將兩臺設備拍攝的最新照片下載到主機

這將是偉大的,如果有人有一個想法如何擺脫這個問題。從我的角度來看,最有利的解決方案是,我告訴消息循環(因爲我發現一個就足夠了),從哪個線程/攝像頭拍攝照片。如果我可以避免使用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.12中禁用了功能kEdsPropID_BodyIDEx,所以我不得不返回到Canon EDSDK版本2.11.3。我希望這會幫助其他用戶解決類似的任務。

乾杯 TL

回答

0

你應該區分使用回調的「語境」參數中的兩個攝像頭。當您使用EdsSetObjectEventHandler註冊回調時,只需將每個攝像頭的唯一值作爲最後一個參數傳遞即可。