2014-11-03 4 views
0

IP 기반 카메라 (basler Ace2000 - 50gm)는 우분투 12.04 64 비트를 실행하는 임베디드 보드에 연결되어 있습니다. 문서에 따라 구성 할 수 있었지만 이제는 원하는 모든 종류의 매개 변수로 프레임 속도로 프레임을 잡을 수 있습니다.갑작스런 충돌 후 프로그램 내의 모든 포인터 변수가 삭제 되었습니까?

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); 
} 

이 코드는 큰 프로그램의 일부입니다

이 여기에 초기화 코드이다 (필자는 C++ API를 사용).

문제는 내 프로그램이 갑자기 중단되고 (소스 엔진을 찾지 못했음) 코드를 다시 실행하면 마지막 충돌 이후 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 내 프로그램은 다음과 같은 우분투에서 서비스 네트워킹 다시 시작하는 경우 :

sudo service network-manager restart 
sudo ifdown eth0 && sudo ifup eth0 
. 
. 
. 

을하지만, 그들 중 누구도 나를 위해 일한 내 프로그램이 충돌 할 때 여전히 실행할 수 있도록 5 분 이상 소요 내 프로그램.

5 분 후에 내 코드가 카메라를 올바르게 감지하고 내 코드를 실행할 수 있다는 것은 놀라운 일입니다. 나는 엄청난 시간을 보냈고 카메라를 탐지하기 위해 코드를 실행하기 위해 적어도 5 분간 머물러야합니다 !!! (다음 5 분 동안 위의 오류 메시지를 보여주기 위해 반복됩니다) 나는이 코드를 내 랩톱에서 여러 번 실행했고 PC가 있지만 코드가 충돌 한 후에 문제가없는 코드를 실행할 수 있으므로 임베디드 보드 네트워크에 문제가 있다고 생각합니다!

나는 모든 종류의 변수가 프로그램을 종료 한 후 삭제된다고 생각했지만 그렇게 생각하는 것이 잘못되었다고 생각합니다!

이 문제를 해결하려는 모든 정보를 제공 할 수 있습니다. 감사합니다.

+0

서비스 프로세스를 사용하여 카메라와 상호 작용하는 코드에서 충돌 코드를 격리하십시오. 주 프로세스가 충돌하면 서비스 프로세스가 정상적으로 종료 될 수 있습니다. –

+0

@DavidSchwartz 이러한 서비스를 작성하는 데 익숙해지기위한 유용한 참고 자료를 보여줄 수 있습니까? 나는 어떻게 시작하고 어디에서 봐야하는지 모른다. – PsP

답변

2

메모리는 해제되었지만 소멸자는 실행되지 않습니다. 아마도 소멸자가 시스템에 더 이상 장치를 제어하고 있음을 알립니다.

나는 이것을 시스템의 버그라고 생각합니다. 특정 프로세스가 장치를 제어한다는 사실은 과 같이 open처럼 많이 동작해야하며 프로세스가 충돌하면 이 분리됩니다. (Unix에서는 같은 종류의 의사 장치로 구현하면됩니다.)

+0

감사합니다.하지만 이전 실행에서 호출 된 열린 메소드를 닫으려면 어떻게해야합니까? 어디에서이 버그를보고해야합니까?!?! – PsP

+0

열린 방법을 닫을 방법이 있습니까? 알 수없는 프로세스에서 열어 본 텍스트 파일에 쓰고 싶다고 가정 해 봅시다. 그것을 할 방법이 있습니까? – PsP

+1

@PsP 보드 공급 업체 또는 시스템에 문의해야합니다. 그들은 분명히 리눅스에 대한 커스텀 익스텐션을 가지고 있으며, 그것들을 문서화하고 유지 보수 할 책임이 있습니다. –

2

C++ 표준 (§18.3/8) : "자동 개체는 exit 호출로 인해 파괴되지 않습니다.). "
"정상적으로 프로세스를 종료하고 프로세스를 종료하기 위해 정기적 인 정리를 수행합니다."
정규 정리는 정적 개체를 삭제하고 동적으로 할당하지 않는 것입니다.

이 문제를 해결하려면 신호 처리기로 어리석은 시도하고 카메라 포인터를 어딘가에 있으면 연결을 끊을 수 있습니다.

메모리 누수가있는 동안 시도해보십시오!

Camera = new Camera_t(); 

와 사이에 무료로

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

. 또한 다른 또 다른 누출이 카메라의 더 반환 그래서

  CAcquireContinuousConfiguration().OnOpened(*Camera); 

어떻게 든 Camera의 주소를 가지고 있다고 가정 없어야있다. 당신이 당신의 장치에 액세스하는 일부 글로벌 방법이있는 경우

Signal handlers

는 신호 처리기의 다음 한 경우 주에서 try-catch 수 없어, 당신의 오류를 잡을 수 있습니다.

+0

언급 좋은 지적! 나는 내가 악의 뿌리를 찾았는지보기 위해 그것을 시험 할 것이다 !! 어쨌든 첫 번째 문장에 대해 더 설명해 주시겠습니까? "신호 처리기로 바보짓을 시도하십시오 ..."정확히 말하면 무엇을 의미합니까? 어떻게해야합니까? – PsP