`

调用算法,监听算法结束

阅读更多
public class BlockQueueService {

    private static final Logger logger = LoggerFactory.getLogger(BlockQueueService.class);
    private static final long MILLILS = 120000;
    private BlockingQueue<String> receivedImg = new LinkedBlockingQueue<>();


    /**
     * 添加解读任务
     * @throws InterruptedException
     */
    public void addUnscrambleTask(String img) throws InterruptedException {
        receivedImg.put(img);
    }


    /**
     * 启动线程
     */
    public BlockQueueService()  {
        execAlgorithmThread.start();
    }


    /**
     * 执行算法的线程
     */
    Thread execAlgorithmThread = new Thread() {
        @Override
        public void run() {
            while (true) {
                try {
                    String sheetAnalysisInfos = receivedImg.take();
                    execAlgorithm(sheetAnalysisInfos);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

        /**
         * 执行算法
         * @param
         */
        private void execAlgorithm(String receivedImg) {
            try {
                    //执行算法解读
                    doPost(receivedImg);
            }catch (Exception e){
                logger.error("execAlgorithm ocr unscramble Exception" , e);
            }

        }
    };


    public void doPost(String filePath){
        String xmlDir = filePath.replace(jpgDir,"");
        xmlDir =rootDir + correctDir +xmlDir.substring(0,xmlDir.lastIndexOf("."))+".xml";
        logger.info("filePath的路径 "+ filePath);
        logger.info("xmlDir的路径" + xmlDir);
        HashMap map = new HashMap();
        map.put("imgPath",filePath);
        map.put("xmlPath",xmlDir);
        String url = "http://############/execAlgorithm";
        int result = 0;
        try {
            result = HttpClient.doPost(url,map);
            logger.info("------- result ---------- 是否为1");
        } catch (Exception e) {
            e.printStackTrace();
        }
        logger.info("-------execAlgorithm----------判断解析后是否生成对应的XML文件");
        if (result==1){
            logger.info("解析生成对应的XML文件");
        }
        File file = new File(xmlDir);
        if (!file.exists()){
            logger.info("AI解析未生成对应的XML文件");
            writeXml(xmlDir);
            logger.info("生成对应的错误XML文件"+xmlDir);
        }
        logger.info("-------execAlgorithm----------释放资源");
    }


    public void doCmd(String filePath){
        String pythonDir = "bone_age_interface.py";
        String pythonpath = "/boneage_data/BoneAge/";
        String xmlDir = filePath.replace(jpgDir,"");
        xmlDir =rootDir + correctDir +xmlDir.substring(0,xmlDir.lastIndexOf("."))+".xml";
        String cmd = "python" + " " + pythonDir + " " + filePath + " " + xmlDir;
        logger.info(cmd + "命令");
        Runtime run = Runtime.getRuntime();
        Process proc = null;
        try {
            proc = run.exec("/bin/bash");
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (proc != null) {
            PrintWriter printWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
            printWriter.println("cd " + pythonpath);
            printWriter.println(cmd);
            printWriter.println("exit");
            WorkerThread worker = null;
            try {
                worker = new WorkerThread(proc);
                worker.start();
                worker.join(MILLILS);
                if (worker.exit != null) {
                    logger.info("-------execAlgorithm----------解析完成");
                } else {
                    throw new TimeoutException();
                }
            } catch (InterruptedException ex) {
                worker.interrupt();
                Thread.currentThread().interrupt();
                ex.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                logger.info("-------execAlgorithm----------判断解析后是否生成对应的XML文件");
                File file = new File(xmlDir);
                boolean result = file.exists();
                if (result) {
                    logger.info("解析生成对应的XML文件");
                } else {
                    logger.info("解析未生成对应的XML文件");
                    writeXml(xmlDir);
                    logger.info("生成对应的错误XML文件"+xmlDir);
                }
                logger.info("-------execAlgorithm----------释放资源");
                printWriter.close();
                proc.destroy();
            }

        }
    }


    private class WorkerThread extends Thread {
        private Process process;
        private Integer exit;

        private WorkerThread(Process process) {
            this.process = process;
        }

        public void run() {
            try {
                logger.info("exit初始化" + exit);
                exit = process.waitFor();
                logger.info("exit在运行完之后" + exit);
            } catch (InterruptedException ignore) {
                return;
            }
        }
    }
}
 
分享到:
评论

相关推荐

    Java代码调用HTML5中的JS函数算法

    Java服务器端可以生成一个包含调用信息的消息,然后由JavaScript监听并处理这个消息。 5. **HTML5的Web Storage**:Java可以修改存储在localStorage或sessionStorage中的数据,JavaScript监听到变化后执行相应函数...

    五子棋AI算法-极大极小值搜索算法代码实现

    3. 用户交互:JavaScript事件监听器可以捕捉用户的落子行为,更新棋盘状态,并调用AI进行下一步决策。同时,JavaScript还可以处理动画效果,提升用户体验。 总结,五子棋AI的实现涉及极大极小值搜索算法和Alpha ...

    利用前端动画实现算法可视化,比如各种排序算法动画实现.zip

    为了实现动画效果,开发者可能会使用requestAnimationFrame API,它可以在浏览器下一次重绘之前调用指定的函数,从而创建平滑的动画效果。此外,CSS3的transition和animation属性也能为动画添加更丰富的视觉效果。 ...

    MTK Fuel Gauge算法分析

    - **battery_meter.c文件:** 负责实现电池电量算法,作为battery_common.c的接口,并调用battery_meter_hal.c中的接口来读取电池信号。 - **battery_meter_initial函数:** 在开机初始化阶段调用,仅运行一次。...

    中点画圆、Bresenham算法画圆和中点画椭圆C#实现

    添加一个窗体,监听鼠标事件。当用户左键点击时,记录下作为圆心的坐标;输入半径后,调用之前实现的画圆函数。对于椭圆,用户点击确定中心,输入长轴和短轴长度,然后调用画椭圆的函数。右键点击可以触发绘制操作,...

    opengl道格拉斯算法

    这需要结合MFC的消息机制,监听控件的改变事件,重新调用算法并重绘图形。 总之,OpenGL道格拉斯-普克算法在MFC下的实现涉及了OpenGL图形渲染、面向对象编程、数据结构、算法以及用户界面交互等多个方面的知识。...

    种子填充算法(非递归)和多边形扫描算法的源代码

    非递归实现通常使用队列数据结构来存储待填充的像素,避免了递归调用带来的栈溢出问题。在C++中,实现这个算法时,可以创建一个队列,将种子点入队,然后不断出队检查周围像素,如果符合条件就加入队列并改变颜色,...

    银行家算法 多种资源

    每次请求后,都会调用银行家算法函数和安全检查函数,确保系统的安全运行。 #### 知识点三:银行家算法流程 银行家算法的执行流程如下: 1. **初始化**:设置资源和进程的初始状态。 2. **资源请求**:当一个进程...

    opengl 消隐算法

    5. 结束后禁用深度测试:如果不再需要深度测试,可以调用`glDisable(GL_DEPTH_TEST)`来关闭它,以节省计算资源。 在给定的描述中,提到可以通过控制键盘实现图形的平移。这通常涉及到在视图矩阵中改变相机的位置,...

    人工智能 AStar 算法 Java实现

    通过监听事件,用户可以点击选择起点和目标点,然后调用AStar算法进行搜索,并实时更新界面显示路径。 总结一下,AStar算法在Java中的实现涉及到启发式函数的设计、节点管理、路径搜索逻辑以及图形界面的交互。理解...

    CPU_Scheduling_cpu调度算法_

    事件监听器用于响应用户的操作,比如点击“调度”按钮时,调用相应的调度算法实现。 5. **模拟过程**:用户可以通过输入进程属性(如到达时间、服务时间)来创建进程,并选择不同的调度算法。程序会模拟这些算法,...

    广工2015银行家算法-java实现带界面

    通过事件监听器,当用户触发操作时,调用相应的后台处理方法(如银行家算法的逻辑)。 在实现过程中,需要注意以下几点: 1. **资源管理**:确保每个进程的资源请求不超过其最大需求,同时系统资源不能被过度分配...

    vc.rar_dda算法vc_dda算法vc++实现_vc dda_vc Bresenham

    同时,直线的拖动和拉伸变换可以通过获取用户输入的新起点和终点,重新调用绘制函数来实现。 拖动变换意味着当用户在屏幕上移动鼠标时,直线会随着鼠标移动。这需要监听鼠标事件,如鼠标按下、移动和释放,然后根据...

    QueryString 传参加密算法

    普通的QueryString在网络传输过程中容易被嗅探或篡改,例如通过Wi-Fi监听、中间人攻击等方式。因此,对于涉及用户隐私或者安全性的数据(如登录凭据、交易信息等),我们需要在客户端对这些参数进行加密处理,然后再...

    as3迷宫走路算法

    在AS3中,我们可以使用DisplayObject类来表示游戏中的角色和障碍物,通过事件监听器处理用户的输入和角色的移动。ActionScript的强类型特性有助于避免类型错误,而面向对象的设计模式(如单例、工厂等)可以优化代码...

    操作系统课程设计银行家算法和页面置换算法.pdf

    用户可以选择启动哪种算法的演示,点击"开始演示"按钮后,会调用相应的Banker和Yemian类进行模拟操作。Banker类可能包含了银行家算法的实现,而Yemian类则可能是页面置换算法的实现。这段代码使用了Swing库构建GUI,...

    QT实现多边形填充算法

    5. **使用`QPainter`绘制**:在`QPainter`对象上使用`drawPolygon()`方法绘制多边形的边框,然后使用一种合适的填充模式(如`Qt::SolidPattern`)调用`fillRect()`或`fillPolygon()`来填充内部。 在实际的QT代码中...

    圆生成算法实现 计算机图形学

    例如,可以创建一个窗口,添加鼠标点击事件来确定圆心,然后调用特定的圆生成算法填充像素。这通常涉及到使用`Graphics`对象来绘制像素,例如`g.fillRect(x, y, 1, 1)`来填充单个像素。 总的来说,圆生成算法在...

    mfc中的自己实现的画线算法

    3. 终止条件:当x坐标达到x1时,算法结束。 在MFC环境中,你可以创建一个CView派生类,重写OnDraw函数来实现画线逻辑。首先,你需要获取设备上下文(CDC对象),然后设置合适的画笔颜色和线型。接着,调用MoveTo和...

    DBSCAN 算法

    对于交互式功能,比如鼠标点击添加数据点,可以监听鼠标事件,在事件处理器中获取鼠标位置并将其转化为数据点,然后调用DBSCAN算法进行聚类分析。为了实现这一点,你需要定义一个函数来执行DBSCAN算法,包括计算邻域...

Global site tag (gtag.js) - Google Analytics