У меня есть IP-камера (basler Ace2000-50gm), подключенная к встроенной плате, которая работает с Ubuntu 12.04 64 бит. Мне удалось настроить его в соответствии с его документацией, и теперь я могу захватить кадры с любой частотой кадров с любыми параметрами, которые мне нравятся. (Я использовал API C++)
Вот инициализирующий код:
typedef Pylon::CBaslerGigEInstantCamera Camera_t;
void Cam_Init()
{
bool Camera_Initialization = false;
Camera_t *Camera;
Camera = new Camera_t();
PylonInitialize();
do{
if(!Camera_Initialization)
{
try
{
CTlFactory& tlFactory = CTlFactory::GetInstance();
// Get all attached devices and exit application if no device is found.
DeviceInfoList_t devices;
qDebug("Detecting Camera ....");
if ( tlFactory.EnumerateDevices(devices) == 0 )
{
throw RUNTIME_EXCEPTION( "No camera present.");
}
Camera = new Camera_t( tlFactory.CreateDevice( devices[0 ]) );
Camera->Open();
CAcquireContinuousConfiguration().OnOpened( *Camera);
Camera->StartGrabbing( GrabStrategy_UpcomingImage);
Camera_Initialization = true;
qDebug("Camera is Configured Successfully");
}
catch( GenericException &e )
{
Interface<< "**** An exception occurred! Desription is: " << "\n"<< " " << e.GetDescription() << "\n";
}
}
}while(!Camera_Initialization);
}
Этот код является частью большой программы.
Проблема в том, что моя программа внезапно падает (я не нашел ее sourceyet), и когда я перезапускаю свой код, он не обнаруживает камеру до 5 минут и более с момента ее последнего сбоя !!! он дает следующее сообщение об ошибке
**** An exception occurred! Desription is:
Failed to open 'Basler acA2000-50gm#00305316A684#10.136.18.100:3956'. The device is controlled by another application. Err: GX status 0xe1018006 (0xE1018006)
поскольку вы видели мой код для инициализации камеры, я использовал объект-указатель для подключения к моей камере, и я думаю, что когда код сработает, этот указатель не будет удален, поэтому камера недоступна!
Я также думаю, что это проблема сети, и я не знаю, как ее решить. Когда моя программа crashesh я пробовал каждый другой способ перезапустить сетевые службы в Ubuntu, такие как:
sudo service network-manager restart
sudo ifdown eth0 && sudo ifup eth0
.
.
.
но ни один из них не работал для меня, и все еще, когда моя программа вылетает, для выполнения моей программы требуется более 5 минут.
Удивительно, что через 5 минут мой код правильно определяет камеру, и я могу запустить свой код. Я пробовал миллионы раз, и я должен остаться не менее 5 минут, чтобы запустить код, чтобы обнаружить камеру !!! (Повторяется, чтобы показать вышеприведенное сообщение об ошибке в течение следующих 5 минут). Я много раз запускал этот код на своем собственном ноутбуке и PC, но после сбоя кода я могу запустить код без каких-либо проблем, поэтому я думаю, что проблема кроется в встроенной сети платформ!
Я думал, что всякие переменные удаляются после завершения программы, но кажется, что это неправильно.
Я могу предоставить любую информацию, которую вы хотите решить эту проблему. благодаря
Память освобождается, но деструкторы не будут запущены. Вероятно, деструктор сообщает системе, что он больше не контролирует устройство.
Я считаю это ошибкой в системе. Тот факт, что определенный процесс контролирует устройство, должен вести себя как open
, и если процесс выйдет из строя, он будет удален. (В Unix это может быть сделано путем реализации, например, своего рода псевдо-устройства).
C++ стандарт (§18.3/8): "Автоматические объекты не уничтожаются в результате вызова exit()".
"Обычно завершает процесс, выполняя регулярную очистку для завершения процессов".
Там, где регулярная очистка - это уничтожение статических объектов, а не динамически распределенных.
Чтобы обойти это, вы можете попробовать обмануть обработчики сигналов и отключиться там, если у вас есть указатель на камеру где-нибудь.
Пока вы пытаетесь, я обнаружил утечку памяти!
Camera = new Camera_t();
а также
Camera = new Camera_t( tlFactory.CreateDevice( devices[0 ]) );
без свободного между ними. Также нет возврата камеры, поэтому я должен предположить, что
CAcquireContinuousConfiguration().OnOpened( *Camera);
как-то имеет адрес Camera
, иначе есть еще одна утечка.
Если у вас есть глобальный способ доступа к вашему устройству, то один из обработчиков сигналов может уловить вашу ошибку, если try-catch
в main не может.