admin
2022-08-25 14db1514fec89db599766d4996b4bb1fead0eff0
ConsoleApplication/L2DataCapture.cpp
@@ -3,6 +3,7 @@
#include<fstream>
#include "THSActionUtil.h"
#include <thread>
#include "TaskChecker.h"
bool L2DataCapture::inited;
bool L2DataCapture::tradeTimeCapture;
@@ -13,6 +14,7 @@
//是否正在执行
bool L2DataCapture::running;
bool L2DataCapture::runnings[THS_FRAME_COUNT];
bool L2DataCapture::killRunnings[THS_FRAME_COUNT];
clock_t L2DataCapture::latest_running_times[THS_FRAME_COUNT];
CallbackFun L2DataCapture::data_callback;
@@ -40,7 +42,9 @@
void L2DataCapture::_run(int index)
{
   while (true) {
      if (killRunnings[index])
         break;
      TaskChecker::clientLiveTime.l2[index] = clock();
      if (tradeTimeCapture) {
         int time = getNowSecondTime();
         //9:20-11:31  12:59-15:01
@@ -134,7 +138,16 @@
      tradeQueueCapture[i] = new TradeQueueCapture();
   }
   running = false;
   int length = sizeof(runnings) / sizeof(runnings[0]);
   for (int i = 0;i < length;i++) {
      runnings[i] = false;
      thread rt(&(L2DataCapture::_run), i);
      rt.detach();
      killRunnings[i] = FALSE;
      //thread rt_trade_queue(&(L2DataCapture::_run_trade_queue), i);
      //rt_trade_queue.detach();
   }
   //获取同花顺窗口句柄
   try {
@@ -143,17 +156,18 @@
   catch (string st) {
      throw st;
   }
   running = false;
   int length = sizeof(runnings) / sizeof(runnings[0]);
   for (int i = 0;i < length;i++) {
      runnings[i] = false;
      thread rt(&(L2DataCapture::_run), i);
      rt.detach();
      //thread rt_trade_queue(&(L2DataCapture::_run_trade_queue), i);
      //rt_trade_queue.detach();
   }
}
void L2DataCapture::reCreateChannelRunner(int index)
{
   //先杀死原有线程
   killRunnings[index] = TRUE;
   Sleep(500);
   killRunnings[index] = FALSE;
   thread rt(&(L2DataCapture::_run), index);
   rt.detach();
}
bool L2DataCapture::isRunning() {
@@ -201,13 +215,15 @@
   clock_t  starttime = clock();
   /*
   if (1 > 0) {
    std:map<string, TradeData> map;
      return map;
   }
   */
   list<TradeData> resultList=  captureLevel2TradeData(openCLExcuter[identify], oimg, identify);
   std::cout << "-------L2行情识别结束任务: threadid-" << std::this_thread::get_id() << "  序号:" << identify << " 耗时:" << clock() - starttime  <<"  数据量:"<< resultList.size() << endl;
   return resultList;
}
list<TradeData> L2DataCapture::captureLevel2TradeData(OpenCLExcuter* openCLExcuter, cv::Mat oimg, int identify)
{
   //LogUtil::debug("截图完成");
   clock_t time_1 = clock();
@@ -225,20 +241,20 @@
   else {
      if (oimg.channels() == 3)
      {
         openCLExcuter[identify]->rgb2Gray(oimg.data, oimg.cols, oimg.rows, imgData);
         openCLExcuter->rgb2Gray(oimg.data, oimg.cols, oimg.rows, imgData);
      }
      else {
         openCLExcuter[identify]->rgba2Gray(oimg.data, oimg.cols, oimg.rows, imgData);
         openCLExcuter->rgba2Gray(oimg.data, oimg.cols, oimg.rows, imgData);
      }
      img.data = imgData;
      oimg.release();
      clock_t time_2_ = clock();
      if (identify == 0)
      {
         std::cout << "灰度完成: threadid-" << std::this_thread::get_id() << " 耗时:" << (time_2_ - time_1) << endl;
         std::cout << "灰度完成: threadid-" << std::this_thread::get_id() << " 耗时:" << (time_2_ - time_1) << "   截图尺寸:" << img.cols << "x" << img.rows << endl;
         std::cout <<"通道数:"<<oimg.channels()<<endl;
         std::cout << "通道数:" << oimg.channels() << endl;
         LogUtil::debug("灰度完成");
      }
   }
@@ -275,7 +291,7 @@
   }
   //一维分块图像数据
   int* rowSplitDataOneLevel = (int*)malloc(sizeof(int) * rowDataList.size() * 4 * 7);
   openCLExcuter[identify]->splitL2RowData(imgData, img.cols, img.rows, rowDataOneLevel, rowDataList.size(), rowSplitDataOneLevel);
   openCLExcuter->splitL2RowData(imgData, img.cols, img.rows, rowDataOneLevel, rowDataList.size(), rowSplitDataOneLevel);
   free(rowDataOneLevel);
   /*
@@ -326,7 +342,7 @@
   //图像识别(除开数字的部分)
   int* notNumberResult = (int*)malloc(sizeof(int) * rowDataList.size() * 3);
   openCLExcuter[identify]->recognitionNotNum(img.data, img.cols, img.rows, rowSplitDataOneLevel, 7, rowDataList.size(), notNumberResult);
   openCLExcuter->recognitionNotNum(img.data, img.cols, img.rows, rowSplitDataOneLevel, 7, rowDataList.size(), notNumberResult);
   int i = 0;
@@ -453,7 +469,7 @@
   if (identify == 0)
      std::cout << "数据准备-0数据准备: threadid-" << std::this_thread::get_id() << " 耗时:" << time_33 - time_32 << "总耗时:" << time_33 - time_1 << endl;
   openCLExcuter[identify]->splitL2Num(imgData, img.cols, img.rows, pos, 4 * rowDataList.size(), zeroData, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, _NUMBER_L2_TOTAL_NUMBER, totalNumberData);
   openCLExcuter->splitL2Num(imgData, img.cols, img.rows, pos, 4 * rowDataList.size(), zeroData, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, _NUMBER_L2_TOTAL_NUMBER, totalNumberData);
   free(zeroData);
   free(pos);
@@ -475,7 +491,7 @@
   //准备模板数字
   uchar* templateNums = (unsigned char*)malloc(sizeof(unsigned char) * (_NUMBER_L2_HEIGHT * rowDataList.size()) * _NUMBER_L2_WIDTH * 10 * _NUMBER_L2_TOTAL_NUMBER);
   openCLExcuter[identify]->createNumberTemplates(rowDataList.size(), _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, _NUMBER_L2_TOTAL_NUMBER, ImgUtil::numsOneLevel_level2, templateNums);
   openCLExcuter->createNumberTemplates(rowDataList.size(), _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, _NUMBER_L2_TOTAL_NUMBER, ImgUtil::numsOneLevel_level2, templateNums);
   //ImgUtil::createTemplateNumData(data.size());
   clock_t time_4 = clock();
@@ -500,7 +516,7 @@
   //数字识别
   uchar** numberResult = openCLExcuter[identify]->recognition_numbers(totalNumberData, templateNums, rowDataList.size() * _NUMBER_L2_HEIGHT, _NUMBER_L2_WIDTH * 10 * _NUMBER_L2_TOTAL_NUMBER, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, _NUMBER_L2_TOTAL_NUMBER);
   uchar** numberResult = openCLExcuter->recognition_numbers(totalNumberData, templateNums, rowDataList.size() * _NUMBER_L2_HEIGHT, _NUMBER_L2_WIDTH * 10 * _NUMBER_L2_TOTAL_NUMBER, _NUMBER_L2_WIDTH, _NUMBER_L2_HEIGHT, _NUMBER_L2_TOTAL_NUMBER);
   //释放内存
   free(totalNumberData);
   free(templateNums);
@@ -555,10 +571,6 @@
   rowDataList.clear();
   list<int*>().swap(rowDataList);
   free(rowSplitDataOneLevel);
   if (identify == 0)
      std::cout << "-------L2行情识别结束任务: threadid-" << std::this_thread::get_id() << "  序号:" << identify << " 耗时:" << clock() - starttime << endl;
   return resultList;
}