Пример #1
0
 /// <summary>
 /// 写入任务信息到 redis
 /// </summary>
 private void WriteTaskInfo(string key, string value)
 {
     try {
         TYData.StringSet(key, value);
     } catch (Exception) {
         //写入失败 不做任何操作
     }
 }
Пример #2
0
        //任务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());
                }
            }
        }