2014-11-03 70 views
0

我有一個基於IP的攝像頭(basler Ace2000-50gm)連接到運行ubuntu 12.04 64bit的嵌入式主板。我設法根據它的文檔進行配置,現在我可以用任何類型的參數以任何幀速率抓取幀。 (我使用C++的API)突然崩潰後,程序中的所有指針變量是否被刪除?

這裏是初始化代碼:

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

從使用服務進程與相機交互的代碼中分離崩潰的代碼。當您的主進程崩潰時,服務進程可以乾淨地關閉。 – 2014-11-04 06:31:09

+0

@DavidSchwartz你能否告訴我一些有用的參考資料,以便熟悉如何編寫這些服務。我不知道該如何開始以及在哪裏看。 – PsP 2014-11-04 07:46:59

回答

2

內存被釋放,但析構函數將不會運行。可能 析構函數通知系統它不再控制設備 。

我會認爲這是系統中的一個錯誤。一個特定的進程控制設備的事實應該像open一樣表現得很多,並且如果進程崩潰,則將脫離爲 。 (在Unix下,這可以通過將其實現爲 某種類型的僞設備來完成)。

+0

謝謝,但我怎麼能關閉一個已經在上次運行中調用的打開方法?我應該在哪裏報告這個錯誤?!?! – PsP 2014-11-03 18:29:38

+0

有什麼辦法可以關閉一個開放的方法嗎?!假設一個由未知進程打開的文本文件,並且我想寫入它。有沒有辦法做到這一點? – PsP 2014-11-03 18:32:55

+1

@PsP您必須聯繫董事會的供應商或其系統。他們顯然有一些自定義的Linux擴展,他們負責記錄和維護它們。 – 2014-11-03 18:55:10

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 2014-11-03 20:02:50