世界要聞:我在使用Winform7.0開發海康相機應用的時候系統悄無聲息的退出
- 來源: 博客園 2023-06-29 17:29:25
【資料圖】
一、簡介1、說明一下最近,我在開發一個玻璃幕墻檢測的項目,這個項目需要使用到海康的相機系統。業務是這樣的,相機按著指定的坐標,掃描玻璃幕墻的每塊玻璃,通過算法查看是否有損壞的,如果有就發出報警信息,告訴客戶。這個項目是有一個同事寫好的,我后來重構了一下,但是運行起來,運行若干次,就退悄無聲息的退出軟件,什么也不提示。通過這個現象,我知道肯定是和硬件交互的時候出了問題,而且拋出任何異常。海康的日志文件也沒有顯示是什么有價值的東西。 但是,通過努力的查找,調試,排除,終于找到了問題的關鍵,我們有四個相機,就有四個回調函數,用于處理圖像,但是每個相機注冊了一個自己的回調,應該是四個相機,設置四個回調,但是回調函數的實例是一個,否則就會出現程序毫無征兆的崩潰。 2、開發平臺開發工具:Visual Studio2022 開發語言:C# 開發平臺:Winform 7.0 海康類庫:MvCamCtrl.NET二、詳細步驟這個問題搞了我兩天才搞定,但是搞定了,心里舒服了。今天就把思路寫下來,自己可以查找,也可以幫助大家。 知道問題的關鍵點了,解決也就方便了。這也叫難著不會,會的不難。
1、一定要把 MyCamera.cbOutputExdelegate 聲明為類的成員。private MyCamera.cbOutputExdelegate _outputImageDelegate;
1 #region 私有實例字段 2 3 private MyCamera[]? _myCameras;//相機實例的數組。 4 private MyCamera.MV_CC_DEVICE_INFO_LIST _deviceInformationList;//相機信息的列表 5 7 //圖片文件的存儲路徑:根目錄/當前掃描時間(作為目錄)/相機編號 8 private string? _saveImageBaseDirectory; //圖像文件存儲的根路徑路徑。 9 private string? _saveImageOnceTimeDirectory; //單次掃描圖像文件的存儲路徑,目錄結構:根目錄+當前掃描時間10 private string[]? _saveImageForCameraDirectory;//最終存儲圖片文件的路徑,目錄結構:根目錄+當前掃描時間+相機序列號(有多少臺相機,就有多少個目錄)11 private IntPtr[]? _imageDisplayHandles;//針對每臺相機圖像進行顯示處理,應為有多臺,所以是數據類型是數組。14 privateMyCamera.cbOutputExdelegate _outputImageDelegate;17 #endregion
2、一定要在構造函數里初始化,當然,如果你可以保證一個實例,就可以放在其他地方,我是為了方便,沒有過多的設計。_outputImageDelegate = new MyCamera.cbOutputExdelegate(SaveImageCallBack);
1 ///2 /// 初始化新實例。 3 /// 4 public frmMonitoring() 5 { 6 InitializeComponent(); 7 _outputImageDelegate = new MyCamera.cbOutputExdelegate(SaveImageCallBack);8 _patrolProcessor = new OrientalMotorPatrolProcessor(); 9 10 11 #region 全局異常處理12 13 AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;14 Application.ThreadException += Application_ThreadException;15 16 #endregion17 }
這是附送的方法,異常處理。
1 #region 異常處理 2 3 ///4 /// 該方法處理用于處理 Windows 窗體線程引發的異常。 5 /// 6 /// 7 /// 8 ///9 private void Application_ThreadException(object sender, ThreadExceptionEventArgs e)10 {11 try12 {13 ShowPromptMessage(e.Exception.Message);14 }15 catch (Exception)16 {17 try18 {19 ShowPromptMessage("不可恢復的非 Windows 窗體線程異常,應用程序將退出!");20 }21 finally22 {23 Application.Exit();24 }25 }26 }27 28 /// 29 /// 使用該方法處理非UI線程所發生的異常。30 /// 31 /// 32 /// 33 ///34 private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)35 {36 try37 {38 var exceptionObject = e.ExceptionObject as Exception;39 if (exceptionObject != null)40 {41 ShowPromptMessage(exceptionObject.Message);42 }43 }44 catch (Exception)45 {46 try47 {48 ShowPromptMessage("不可恢復的非 Windows 窗體線程異常,應用程序將退出!");49 }50 finally51 {52 Application.Exit();53 }54 }55 56 }57 58 #endregion
輔助方法。
1 ///2 /// 用于顯示系統的提示信息,包括異常信息、操作信息等。 3 /// 4 /// 需要顯示的信息內容。 5 /// 具體操作的狀態碼值,該值可有可無,不是所有操作都有狀態值的,默認值:0,表示沒有狀態值。 6 private void ShowPromptMessage(string message, int stateCode = 0) 7 { 8 string resultMessage; 9 if (stateCode == 0)10 {11 resultMessage = $"{message}\r\n";12 }13 else14 {15 resultMessage = $"{message}: Error ={string.Format("{0:X}", stateCode)}";16 }17 18 switch (stateCode)19 {20 case MyCamera.MV_E_HANDLE: resultMessage += ",錯誤或無效句柄(Error or invalid handle)\r\n"; break;21 case MyCamera.MV_E_SUPPORT: resultMessage += ",不支持的功能(Not supported function)\r\n"; break;22 case MyCamera.MV_E_BUFOVER: resultMessage += ",緩存已滿(Cache is full)\r\n"; break;23 case MyCamera.MV_E_CALLORDER: resultMessage += ",函數調用順序錯誤(Function calling order error)\r\n"; break;24 case MyCamera.MV_E_PARAMETER: resultMessage += ",不正確的參數(Incorrect parameter)\r\n"; break;25 case MyCamera.MV_E_RESOURCE: resultMessage += ",應用資源失敗(Applying resource failed)\r\n"; break;26 case MyCamera.MV_E_NODATA: resultMessage += ",沒有數據(No data )\r\n"; break;27 case MyCamera.MV_E_PRECONDITION: resultMessage += ",前提條件錯誤,或運行環境已更改(Precondition error, or running environment changed)\r\n"; break;28 case MyCamera.MV_E_VERSION: resultMessage += ",版本不匹配(Version mismatches)\r\n"; break;29 case MyCamera.MV_E_NOENOUGH_BUF: resultMessage += ",內存不足(Insufficient memory)\r\n"; break;30 case MyCamera.MV_E_UNKNOW: resultMessage += ",未知錯誤(Unknown error)\r\n"; break;31 case MyCamera.MV_E_GC_GENERIC: resultMessage += ",一般錯誤(General error)\r\n"; break;32 case MyCamera.MV_E_GC_ACCESS: resultMessage += ",節點訪問條件錯誤(Node accessing condition error)\r\n"; break;33 case MyCamera.MV_E_ACCESS_DENIED: resultMessage += ",沒有權限(No permission)\r\n"; break;34 case MyCamera.MV_E_BUSY: resultMessage += ",設備正忙或網絡斷開連接(Device is busy, or network disconnected)\r\n"; break;35 case MyCamera.MV_E_NETER: resultMessage += ",網絡錯誤(Network error)\r\n"; break;36 }37 38 SetAsyncControlText(txtExceptionMessage, $">> {resultMessage}", true);39 }
3、實例化相機,并初始化回調函數。
1 MyCamera.MV_CC_DEVICE_INFO[] _deviceInfoArray = new MyCamera.MV_CC_DEVICE_INFO[localDeviceCount]; 2 object? localDeviceInfo = null; 3 MyCamera.MV_CC_DEVICE_INFO device; 4 5 for (int i = 0; i < localDeviceCount; ++i) 6 { 7 if (_deviceInformationList.pDeviceInfo != null && _deviceInformationList.pDeviceInfo.Length > 0) 8 { 9 localDeviceInfo = Marshal.PtrToStructure(_deviceInformationList.pDeviceInfo[i], typeof(MyCamera.MV_CC_DEVICE_INFO));10 if (localDeviceInfo != null)11 {12 //獲取選擇的設備信息13 device = (MyCamera.MV_CC_DEVICE_INFO)localDeviceInfo;14 15 //打開設備16 if (cameras[i] == null)17 {18 cameras[i] = new MyCamera();19 }20 21 stateCode = cameras[i].MV_CC_CreateDevice_NET(ref device);22 if (MyCamera.MV_OK != stateCode)23 {24 return;25 }26 27 stateCode = cameras[i].MV_CC_OpenDevice_NET();28 if (MyCamera.MV_OK != stateCode)29 {30 return;31 }32 else33 {34 _deviceInfoArray[i] = device;35 // 探測網絡最佳包大小(只對GigE相機有效),我們是USB相機36 if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)37 {38 int nPacketSize = cameras[i].MV_CC_GetOptimalPacketSize_NET();39 if (nPacketSize > 0)40 {41 stateCode = cameras[i].MV_CC_SetIntValue_NET("GevSCPSPacketSize", (uint)nPacketSize);42 if (stateCode != MyCamera.MV_OK)43 {44 ShowPromptMessage("Warning: Set Packet Size failed {0:x8}", stateCode);45 }46 }47 else48 {49 ShowPromptMessage("Warning: Get Packet Size failed {0:x8}", stateCode);50 }51 }52 53 //1、開啟設置觸發模式 54 SetCameraTriggerMode(cameras[i]);55 //2、設置具體的觸發模式為軟觸發56 SetCameraTriggerSource(cameras[i]);57 cameras[i].MV_CC_RegisterImageCallBackEx_NET(_outputImageDelegate, i);58 }59 }60 }61 }
4、回調方法的實現。回調的方法可以根據自己的需求編寫,這是我的需求,我的具體編寫方法,不能照抄。
1 ///2 /// 獲取幀數據并保存為圖像的回調函數。 3 /// 4 /// 圖像的幀數據。 5 /// 圖像的幀信息。 6 /// 相機的索引,因為有多臺相機。 7 private void SaveImageCallBack(IntPtr frameData, ref MyCamera.MV_FRAME_OUT_INFO_EX frameInfo, IntPtr cameraIndex) 8 { 9 int _cameraIndex = (int)cameraIndex;10 11 if (_perCameraTotalFrames != null && _perCameraTotalFrames.Length > 0)12 {13 //抓取的幀數14 ++_perCameraTotalFrames[_cameraIndex];15 16 //第一個相機數據,每臺相機處理的數據是一樣的,隨機選擇第一個,作為結果輸出。17 if (_cameraIndex == 0)18 {19 SetAsyncControlText(lblAcquisitionCountValue, _perCameraTotalFrames[_cameraIndex].ToString());20 }21 }22 23 //顯示圖像 24 //將相機圖像顯示到對應的位置25 if (_imageDisplayHandles != null && _imageDisplayHandles.Length > 0)26 {27 MyCamera.MV_DISPLAY_FRAME_INFO displayFrameInfo = new MyCamera.MV_DISPLAY_FRAME_INFO();28 displayFrameInfo.hWnd = _imageDisplayHandles[_cameraIndex];29 displayFrameInfo.pData = frameData;30 displayFrameInfo.nDataLen = frameInfo.nFrameLen;31 displayFrameInfo.nWidth = frameInfo.nWidth;32 displayFrameInfo.nHeight = frameInfo.nHeight;33 displayFrameInfo.enPixelType = frameInfo.enPixelType;34 35 if (_myCameras != null && _myCameras.Length > 0)36 {37 CameraDisplayOneFrame(_myCameras[_cameraIndex], ref displayFrameInfo);38 }39 }40 41 //判斷當前相機是否允許保存圖像42 if (_isPerCameraSaveImage != null && _isPerCameraSaveImage.Length > 0)43 {44 if (_isPerCameraSaveImage[_cameraIndex] && _saveImageForCameraDirectory != null && _saveImageForCameraDirectory.Length > 0 && _perCameraSerialNumbers != null && _perCameraSerialNumbers.Length > 0)45 {46 MyCamera.MV_SAVE_IMG_TO_FILE_PARAM stSaveToFileParam = new MyCamera.MV_SAVE_IMG_TO_FILE_PARAM();47 48 stSaveToFileParam.enPixelType = frameInfo.enPixelType;49 stSaveToFileParam.pData = frameData;50 stSaveToFileParam.nDataLen = frameInfo.nFrameLen;51 stSaveToFileParam.nWidth = frameInfo.nWidth;52 stSaveToFileParam.nHeight = frameInfo.nHeight;53 54 stSaveToFileParam.enImageType = MyCamera.MV_SAVE_IAMGE_TYPE.MV_Image_Bmp;55 stSaveToFileParam.nQuality = 100;56 //圖像文件名應包含采集時間、對應相機ID號、玻璃編號等信息57 var saveImageFullPath = $"{_saveImageForCameraDirectory[_cameraIndex]}\\{DateTime.Now.ToString("yyyyMMddHHmmss")}_{_perCameraSerialNumbers[_cameraIndex]}_{_patrolFileGlassNumber}.bmp";58 stSaveToFileParam.pImagePath = saveImageFullPath;59 60 if (_myCameras != null && _myCameras.Length > 0)61 {62 _myCameras[_cameraIndex].MV_CC_SaveImageToFile_NET(ref stSaveToFileParam);63 CameraSaveImageToFile(_myCameras[_cameraIndex], ref stSaveToFileParam);64 }65 }66 }67 }
三、總結我已經實驗過單相機回調沒問題了,所以多相機就直接復制了多個回調,因此相機回調還沒傳到外面的實例,就已經崩了,肯定就是封裝的問題。看了海康的多相機demo,相機有4個實例,回調函數只有一個實例,4個相機注冊了四次回調,但都是同一個回調實例。這就是我發生錯誤的根本原因。 好了,問題解決了,又學了點技術,繼續努力,蒼天不負努力的人。
標簽:
【免責聲明】
1、凡本網注明出處非(巨潮財經網)的作品,均轉載于自其它媒體,并不代表本網贊同其觀點和對其真實性負責,目的在于信息的傳遞,本網不承擔稿件侵權行為的連帶責任,如對稿件有質疑請與本網客服聯系。
2、刊發此文目的在于傳遞更多信息,文章內容僅供參考,不構成投資建議,投資者據此操作,風險自擔。
3、如涉及作品內容、版權等其它問題,請在15日內聯系本網客服。
-
-
世界要聞:我在使用Winform7.0開發海康相機應用的時候系統悄無聲息的退出
一、簡介1、說明一下最近,我在開發一個玻璃幕墻檢測的項目,這個項目
2023-06-29 17:29:25
-
-
群峰互聯網_如何入駐群峰伙伴
吸引定律,簡單來說就是好的想法和態度決定吸引更多好的東西給你,消極
2023-06-29 17:05:55
-
-
天天即時看!獨家!甘肅350億氫能項目招標方并非國家電投旗下公司
每經訊6月21日,中廣通科技(酒泉)有限公司發布了4GW光伏離網制氫項目
2023-06-29 16:22:40
-
-
多家高校下月起停用微信支付,微信團隊致歉:即刻修正
由于微信支付將收取0 6%的手續費,近期,全國多家高校發布公告稱,自7
2023-06-29 16:13:59
-
-
國家金融監管總局批復!涉及大家財險多名高管任職資格 環球快報
6月29日消息,國家金融監管總局日前批復,核準林道大家財產保險有限責
2023-06-29 15:43:30
-
-
世界要聞:我在使用Winform7.0開發海康相機應用的時候系統悄無聲息的退出
一、簡介1、說明一下最近,我在開發一個玻璃幕墻檢測的項目,這個項目
2023-06-29 17:29:25
-
世紀佳緣邀您來組局,了解“搭子文化”
時代變遷,潮起潮落。在科技不斷發展的今天,人們的生活觀、價值觀
2023-06-29 17:01:26
-
-
群峰互聯網_如何入駐群峰伙伴
吸引定律,簡單來說就是好的想法和態度決定吸引更多好的東西給你,消極
2023-06-29 17:05:55
-
找到你的搭子,志同道合的朋友世紀佳緣幫您搞定
飯搭子,旅行搭子,閱讀搭子,游戲搭子……每個人都需要找到一個搭
2023-06-29 16:54:14
-
-
沈子瑜:星紀魅族集團以「手機域」開創融合發展新未來|全球熱聞
2023年6月28日至6月30日,2023MWC上海世界移動通信大會(簡稱「MWC上海
2023-06-29 16:44:01
-
-
自主新能源品牌加速出海 中金預計2023年乘用車出口有望超350萬輛_天天聚看點
中國自主新能源品牌出海步伐正在加快。6月29日,比亞迪巴西子公司負責
2023-06-29 16:52:11
-
-
上汽否認MG印度公司被低價收購
上汽集團發布澄清聲明否認旗下MG印度公司被當地強行低價收購。6月26日
2023-06-29 16:38:10
-
-
法英礦商將聯手開發英國最大鋰礦
財經網汽車6月29日訊法國礦業集團Imerys將與英國的BritishLithium組建
2023-06-29 16:51:45
-
-
網貸無力償還最壞結果是什么?網貸確實無力償還怎么辦
網貸無力償還最壞結果是什么1、信用記錄受損網絡借貸屬于信用貸款,逾期還款會影響個人信用記錄。在銀行或其他金融機構查詢信...
2023-06-29 16:55:06
-
-
網貸無力償還會被列為失信人嗎?失信人員一輩子還不起怎么辦
網貸無力償還會被列為失信人嗎欠下的網貸無法還清,借款方可能會將你列為失信人。這會對你的信用記錄造成嚴重的影響,影響你...
2023-06-29 16:53:15
-
-
欠了網貸無力償還怎么辦?網貸逾期多久會被起訴
欠了網貸無力償還怎么辦首先,如果你欠下了網貸無力償還,不要驚慌。應該冷靜分析自己的情況,制定出一份還款計劃。可以嘗試...
2023-06-29 16:51:45
-
-
欠信用卡逾期了自救的辦法是什么?信用卡逾期了怎么恢復
欠信用卡逾期了自救的辦法是什么1 及時還款如果您欠了信用卡,應該盡快還款。如果您無法一次性還清,可以與銀行協商制定還款...
2023-06-29 16:50:06
-
-
欠信用卡30萬死了要家人還嗎?信用卡逾期了無力償還怎么辦
欠信用卡30萬死了要家人還嗎要還。根據中國法律,如果債務人去世,債務應該由遺產來償還。如果遺產不足以償還債務,家人是不...
2023-06-29 16:47:49
-
-
欠信用卡30萬死了怎么辦?欠信用卡30萬要判幾年
欠信用卡30萬死了怎么辦1 及時通知銀行如果您欠了信用卡30萬,無法償還,應該及時通知銀行。銀行會根據您的情況,給出相應的...
2023-06-29 16:46:23
-
-
網商貸的錢還不起了會承擔刑事責任嗎?網商貸的錢還不起了怎么辦
網商貸的錢還不起了會承擔刑事責任嗎借款人存在欺詐行為將面臨刑事責任。但是,如果借款人是因為自身原因無法按時還款,不會...
2023-06-29 16:44:43
-
-
天天即時看!獨家!甘肅350億氫能項目招標方并非國家電投旗下公司
每經訊6月21日,中廣通科技(酒泉)有限公司發布了4GW光伏離網制氫項目
2023-06-29 16:22:40
-
-
網商貸的錢還不起可以報警嗎?網商貸還不起做多久牢
網商貸的錢還不起可以報警嗎借款人無法與網商貸客服協商解決問題,可以向公安機關報案。但是,報案前需要先確認自己是否存在...
2023-06-29 16:41:58
-
-
網商貸的錢還不起了怎么辦?網貸還不起了怎么辦
網商貸的錢還不起了怎么辦借款人無法按時還款,首先應該盡快與網商貸的客服聯系,說明自己的情況,并請求延期還款或者分期還...
2023-06-29 16:40:25
-
-
網貸協商還款需要準備什么材料?網貸如何協商延期還款
網貸協商還款需要準備什么材料1 貸款合同:需要提供貸款合同的原件或復印件,以便確認欠款金額和還款期限等信息。2 身...
2023-06-29 16:38:27
-
-
網貸協商還款對信用有影響嗎?網貸協商還本金技巧是什么
網貸協商還款對信用有影響嗎網貸協商還款對信用有一定的影響。如果你按照協商的還款方式還款,那么這種還款方式會被記錄在你...
2023-06-29 16:36:10
-
-
網貸怎么協商還款?債務委托延期還款是真的嗎
網貸怎么協商還款1 延期還款:可以與網貸公司協商,將還款日期延后一段時間,以減輕還款壓力。2 分期還款:可以與網貸...
2023-06-29 16:34:11
-
-
網貸爆通訊錄報警有用嗎?永遠不接催收電話后果是什么
網貸爆通訊錄報警有用嗎有用。個人信息被泄露,導致騷擾電話的數量非常多,那么你可以考慮報警。因為這是一種有效的維權手段...
2023-06-29 16:32:10
-
-
網貸爆通訊錄刪除通訊錄有用嗎?網貸逾期五六年催收有用嗎
網貸爆通訊錄刪除通訊錄有用嗎有用,但不能完全解決問題。因為網貸公司可能已經將你的個人信息上傳到了其他的平臺,或者將你...
2023-06-29 16:29:18
-
-
網貸現在還爆通訊錄嗎?網貸逾期了暫時還不上怎么辦
網貸現在還爆通訊錄嗎這種情況在過去確實存在過,但是現在已經得到了有效的遏制。首先,現在的網貸公司都有比較完善的信息保...
2023-06-29 16:29:15
-
-
快播:太和水: 截止5月31日,公司股東戶數為13,079
太和水(605081)06月29日在投資者關系平臺上答復了投資者關心的問題。
2023-06-29 16:05:20
-
-
csgo開箱系統要錢嗎?csgo開箱子多少錢一次
作為csgo老玩家,相信很多人都知道這款游戲里開箱獲取的是皮膚飾品等可以在游戲中跟玩家之間互相交易,因此這里面就存在理財...
2023-06-29 16:23:25
-
-
csgo開箱網站賺錢嗎?csgo開箱主播好當嗎
CSGO網站開箱全透明幾率,保底出貨,紅色手套,金色巨龍傳說開箱即有幾率獲取。與眾不同的花式貼紙,造型炫酷的匕首外觀,開...
2023-06-29 16:20:02
-
-
csgo開箱靠譜嗎?csgo開箱如何出金
現在市面上的開箱平臺有非常多,許多玩家都躍躍欲試,想成為那個一夜暴富的歐皇,那么哪個csgo開箱平臺出傳說皮膚概率高呢,...
2023-06-29 16:15:32
-
-
價格戰開啟,6月多家銀行理財宣布產品費率“打折”
界面新聞記者|韓宇航界面新聞編輯|繼招銀理財發售“不賺錢不收管理費”
2023-06-29 16:03:02
-
-
A股收評:三大指數震蕩整理,機器人概念掀漲停潮
兩市共3350股上漲,全日成交8650億元。
2023-06-29 15:55:25