Как сохранить мою камеру живой, когда я использую Cannon EDSDK в своем коде C++?
Я думаю, что важно отправлять сообщение на камеру каждые несколько минут, поэтому я инициализирую свою камеру и время от времени отправляю сообщение на камеру в своем основном потоке, а в другом - открываю liveview для обработки других моих заданий., но в ветке liveview время ожидания при отправке этого сообщения:
EdsSetPropertyData(theCamera, kEdsPropID_Evf_Mode, 0, sizeof(evfMode), &evfMode)
Я никогда не сталкивался с этим, когда все работы выполнялись в одном потоке , Я не знаю, почему это происходит так, кто-то может мне помочь? Вот часть моего кода.
мой основной поток: (я не отправляю сообщение keepalive в теме, но также и время ожидания при запуске liveview!)
CanonCameraWrapper& wrapper = param->wrapper;
bool setup_ok = wrapper.setup(0);
if (!setup_ok)
{
wrapper.destroy();
}
wrapper.setDownloadPath("img");
pthread_t camera_thread;
pthread_create(&camera_thread, NULL, camera_thread_func, (void *)(param));
pthread_join(camera_thread, NULL);
другая нить
void * camera_thread_func(void * arg)
{
global_param* param = (global_param*)arg;
CanonCameraWrapper& wrapper = param->wrapper;
wrapper.beginLiveView();//**//it wait time out here!!!**
...
}
1 ответ
Я считаю, что есть две вещи, о которых вы должны знать. Одним из них является это уведомление в документации Canon SDK:
При создании приложений, работающих под Windows, для каждого потока требуется инициализация COM, чтобы получить доступ к камере из потока, отличного от основного потока. Чтобы создать пользовательский поток и получить доступ к камере из этого потока, обязательно запустите CoInitializeEx( NULL, COINIT_APARTMENTTHREADED) в начале потока и CoUnInitialize() в конце. Пример кода показан ниже. То же самое происходит при управлении объектами EdsVolumeRef или EdsDirectoryItemRef из другого потока, а не только с помощью EdsCameraRef
Другое дело: вы не можете получить доступ (в большинстве случаев) к SDK одновременно. Так что, если вы используете несколько потоков, вы должны быть осторожны с этим