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服务器端可以生成一个包含调用信息的消息,然后由JavaScript监听并处理这个消息。 5. **HTML5的Web Storage**:Java可以修改存储在localStorage或sessionStorage中的数据,JavaScript监听到变化后执行相应函数...
3. 用户交互:JavaScript事件监听器可以捕捉用户的落子行为,更新棋盘状态,并调用AI进行下一步决策。同时,JavaScript还可以处理动画效果,提升用户体验。 总结,五子棋AI的实现涉及极大极小值搜索算法和Alpha ...
为了实现动画效果,开发者可能会使用requestAnimationFrame API,它可以在浏览器下一次重绘之前调用指定的函数,从而创建平滑的动画效果。此外,CSS3的transition和animation属性也能为动画添加更丰富的视觉效果。 ...
5. 结束后禁用深度测试:如果不再需要深度测试,可以调用`glDisable(GL_DEPTH_TEST)`来关闭它,以节省计算资源。 在给定的描述中,提到可以通过控制键盘实现图形的平移。这通常涉及到在视图矩阵中改变相机的位置,...
添加一个窗体,监听鼠标事件。当用户左键点击时,记录下作为圆心的坐标;输入半径后,调用之前实现的画圆函数。对于椭圆,用户点击确定中心,输入长轴和短轴长度,然后调用画椭圆的函数。右键点击可以触发绘制操作,...
- **battery_meter.c文件:** 负责实现电池电量算法,作为battery_common.c的接口,并调用battery_meter_hal.c中的接口来读取电池信号。 - **battery_meter_initial函数:** 在开机初始化阶段调用,仅运行一次。...
这需要结合MFC的消息机制,监听控件的改变事件,重新调用算法并重绘图形。 总之,OpenGL道格拉斯-普克算法在MFC下的实现涉及了OpenGL图形渲染、面向对象编程、数据结构、算法以及用户界面交互等多个方面的知识。...
非递归实现通常使用队列数据结构来存储待填充的像素,避免了递归调用带来的栈溢出问题。在C++中,实现这个算法时,可以创建一个队列,将种子点入队,然后不断出队检查周围像素,如果符合条件就加入队列并改变颜色,...
每次请求后,都会调用银行家算法函数和安全检查函数,确保系统的安全运行。 #### 知识点三:银行家算法流程 银行家算法的执行流程如下: 1. **初始化**:设置资源和进程的初始状态。 2. **资源请求**:当一个进程...
通过监听事件,用户可以点击选择起点和目标点,然后调用AStar算法进行搜索,并实时更新界面显示路径。 总结一下,AStar算法在Java中的实现涉及到启发式函数的设计、节点管理、路径搜索逻辑以及图形界面的交互。理解...
事件监听器用于响应用户的操作,比如点击“调度”按钮时,调用相应的调度算法实现。 5. **模拟过程**:用户可以通过输入进程属性(如到达时间、服务时间)来创建进程,并选择不同的调度算法。程序会模拟这些算法,...
通过事件监听器,当用户触发操作时,调用相应的后台处理方法(如银行家算法的逻辑)。 在实现过程中,需要注意以下几点: 1. **资源管理**:确保每个进程的资源请求不超过其最大需求,同时系统资源不能被过度分配...
同时,直线的拖动和拉伸变换可以通过获取用户输入的新起点和终点,重新调用绘制函数来实现。 拖动变换意味着当用户在屏幕上移动鼠标时,直线会随着鼠标移动。这需要监听鼠标事件,如鼠标按下、移动和释放,然后根据...
普通的QueryString在网络传输过程中容易被嗅探或篡改,例如通过Wi-Fi监听、中间人攻击等方式。因此,对于涉及用户隐私或者安全性的数据(如登录凭据、交易信息等),我们需要在客户端对这些参数进行加密处理,然后再...
在AS3中,我们可以使用DisplayObject类来表示游戏中的角色和障碍物,通过事件监听器处理用户的输入和角色的移动。ActionScript的强类型特性有助于避免类型错误,而面向对象的设计模式(如单例、工厂等)可以优化代码...
用户可以选择启动哪种算法的演示,点击"开始演示"按钮后,会调用相应的Banker和Yemian类进行模拟操作。Banker类可能包含了银行家算法的实现,而Yemian类则可能是页面置换算法的实现。这段代码使用了Swing库构建GUI,...
5. **使用`QPainter`绘制**:在`QPainter`对象上使用`drawPolygon()`方法绘制多边形的边框,然后使用一种合适的填充模式(如`Qt::SolidPattern`)调用`fillRect()`或`fillPolygon()`来填充内部。 在实际的QT代码中...
例如,可以创建一个窗口,添加鼠标点击事件来确定圆心,然后调用特定的圆生成算法填充像素。这通常涉及到使用`Graphics`对象来绘制像素,例如`g.fillRect(x, y, 1, 1)`来填充单个像素。 总的来说,圆生成算法在...
3. 终止条件:当x坐标达到x1时,算法结束。 在MFC环境中,你可以创建一个CView派生类,重写OnDraw函数来实现画线逻辑。首先,你需要获取设备上下文(CDC对象),然后设置合适的画笔颜色和线型。接着,调用MoveTo和...
对于交互式功能,比如鼠标点击添加数据点,可以监听鼠标事件,在事件处理器中获取鼠标位置并将其转化为数据点,然后调用DBSCAN算法进行聚类分析。为了实现这一点,你需要定义一个函数来执行DBSCAN算法,包括计算邻域...