/// <summary> /// 写入任务信息到 redis /// </summary> private void WriteTaskInfo(string key, string value) { try { TYData.StringSet(key, value); } catch (Exception) { //写入失败 不做任何操作 } }
//任务2,不断读取Redis节点信息存储并匹配吊弦图像 private void TaskMatchImg() { ImgSaveNode imgNode; CallInfo?.Invoke($"T#读取吊弦数据!\n"); //直到有值为止 while (queImgInfo.Count == 0) { Thread.Sleep(3000);//休眠3秒 } lock (obj) { imgNode = queImgInfo.Dequeue(); CallInfo?.Invoke($"T#匹配杆号:{imgNode.sKM_Pole}\n"); } while (_taskRunning) { //获取数据起始下标--防止redis数据库崩溃 bool redisConn = false; while (!redisConn) { try { if (RedisHelper.IsConnect) { if (!RedisHelper.ReConnect()) { Thread.Sleep(1000);//休息1秒重试 continue; } } string lsImgInd = TYData.StringGet("LstImgInd"); if (string.IsNullOrEmpty(lsImgInd)) { _iImgInd = 0; } _iImgInd = long.Parse(lsImgInd); redisConn = true; } catch (Exception) { _iImgInd = 0; redisConn = false; } } if (queImgInfo.Count < 3) { Thread.Sleep(1000);//防止redis数据写的太慢来不及匹配 } string[] imgKeys = imgInfoDB.ListRange("list", _iImgInd, _iImgInd + m_iSaveImgNumByOnce); for (int i = 0; i < imgKeys.Length; ++i) { string imgKey = imgKeys[i]; string sJson = imgInfoDB.StringGet(imgKey); if (string.IsNullOrEmpty(sJson)) { continue; } //考虑一种情况,redis数据库崩溃了 丢失了很多图像, 中间很多定位信息无用直接跳过 //t: 132430543471152878 min 132430663964619500 max PicInfo picInfo = JsonHelper.GetModel <PicInfo>(sJson); Int64 imgTimeStamp = picInfo.UTC;//ConvertUTC(imgKey); //说明redis中的图像 比 当前MongoDB数据早,扔掉 if (imgTimeStamp < imgNode.minImgTimeStamp) { continue; }//min<imgTimeStamp<max else if (imgTimeStamp < imgNode.maxImgTimeStamp) { imgNode.lstImgId.Add(imgKey);//添加到列表中 //获取图像数据 并存储 byte[] imgData = imgDB.GetByte(imgKey); //PATH+ 战区 \ 公里标_杆号\ 时间_k公里标_杆号_区域编号_相机编号 115600414_K5778_Z2-25_6_13 string imgFullPath = Path.Combine(TaskPath, imgNode.StationName); // \ 公里标_杆号\ imgFullPath = Path.Combine(imgFullPath, "K" + imgNode.sKM_Pole); FileHelper.CreateDir(imgFullPath);//如果不存在则创建当前文件夹 string cid = FileHelper.iTos(picInfo.CID); string imgName = GetImgName(imgKey, cid, imgNode.sKM_Pole); //MessageBox.Show(imgFullPath); bool flag = FileHelper.ImgToFile(Path.Combine(imgFullPath, imgName), imgData); if (flag) { //成功存储 进行计数 ++_iTotalSaveNum; CallInfo?.Invoke($"T#杆号:{imgNode.sKM_Pole} -- 共存储:{_iTotalSaveNum}条\n"); } } else { //当前图像信息时间戳>杆号记录点时间戳 垮杆了则重新获取imgTimeStamp>=imgNode.maxImgTimeStamp while (queImgInfo.Count == 0) { //若队列里面没有数据//休眠5秒 Thread.Sleep(5000); } string sjsonSaveNode = JsonHelper.GetJson(imgNode); WriteTaskInfo(imgNode.sKM_Pole, sjsonSaveNode); //存储 lock (obj) { imgNode = queImgInfo.Dequeue(); //直到有值为止 CallInfo?.Invoke($"T#匹配杆号:{imgNode.sKM_Pole}\n"); } --i; } } if (imgKeys.Length == 0) { Thread.Sleep(10000);//若没有图像获取到休眠10秒 } else { _iImgInd += imgKeys.Length; // LogRecord();//日志数据记录 //记录读取图像列表的下标 WriteTaskInfo("LstImgInd", _iImgInd.ToString()); //记录存储的图像总数量 WriteTaskInfo("saveImgNum", _iTotalSaveNum.ToString()); } } }