Все переменные-указатели внутри программы были удалены после внезапного сбоя?

0

У меня есть 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, но после сбоя кода я могу запустить код без каких-либо проблем, поэтому я думаю, что проблема кроется в встроенной сети платформ!

Я думал, что всякие переменные удаляются после завершения программы, но кажется, что это неправильно.

Я могу предоставить любую информацию, которую вы хотите решить эту проблему. благодаря

  • 0
    Изолируйте ваш аварийный код от кода, который взаимодействует с камерой, используя процесс обслуживания. Когда ваш основной процесс дает сбой, сервисный процесс может завершиться чисто.
  • 0
    @DavidSchwartz Можете ли вы показать мне несколько полезных ссылок для знакомства с написанием подобных услуг. Я не знаю, с чего мне начать и на что посмотреть.
Теги:
networking
ip-camera

2 ответа

2

Память освобождается, но деструкторы не будут запущены. Вероятно, деструктор сообщает системе, что он больше не контролирует устройство.

Я считаю это ошибкой в системе. Тот факт, что определенный процесс контролирует устройство, должен вести себя как open, и если процесс выйдет из строя, он будет удален. (В Unix это может быть сделано путем реализации, например, своего рода псевдо-устройства).

  • 0
    Спасибо, но как я могу закрыть открытый метод, который был вызван в предыдущем запуске? !!! Куда мне сообщать об этой ошибке?!?!
  • 0
    Есть ли способ закрыть открытый метод ?! предположим, текстовый файл, который открыт неизвестным процессом, и я хочу написать в него. есть ли способ сделать это?
Показать ещё 7 комментариев
2

C++ стандарт (§18.3/8): "Автоматические объекты не уничтожаются в результате вызова exit()".
"Обычно завершает процесс, выполняя регулярную очистку для завершения процессов".
Там, где регулярная очистка - это уничтожение статических объектов, а не динамически распределенных.

Чтобы обойти это, вы можете попробовать обмануть обработчики сигналов и отключиться там, если у вас есть указатель на камеру где-нибудь.

Пока вы пытаетесь, я обнаружил утечку памяти!

Camera = new Camera_t();

а также

       Camera  = new Camera_t(  tlFactory.CreateDevice( devices[0 ]) );

без свободного между ними. Также нет возврата камеры, поэтому я должен предположить, что

            CAcquireContinuousConfiguration().OnOpened( *Camera);

как-то имеет адрес Camera, иначе есть еще одна утечка.

Обработчики сигналов

Если у вас есть глобальный способ доступа к вашему устройству, то один из обработчиков сигналов может уловить вашу ошибку, если try-catch в main не может.

  • 0
    Хорошее замечание! Я проверю это, чтобы увидеть, нашел ли я корень зла !! В любом случае, можете ли вы объяснить немного больше о своем первом утверждении «попробуйте пошутить с обработчиками сигналов ...», что именно вы имеете в виду, говоря это и что я должен делать?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню