我正在构建一个用于c ++程序的Java GUI,并且我很痴迷于调用我的exe文件的ProcessBuilder。
我用C ++编写这个小程序只是为了测试这个ProcessBuilder的东西,看看我是否可以控制I / O流:
df_sample1['counties'].fillna("", inplace=True)
我的Java代码如下:
func mapView(mapaView: MKMapView, viewForAnnotation anotacion: MKAnnotation) -> MKAnnotationView? {
if !(anotacion is MKAnnotationCostum) {
let reusarId = "anotacion"
var anotacionView = mapaView.dequeueReusableAnnotationViewWithIdentifier(reusarId)
if anotacionView == nil {
anotacionView = MKAnnotationView(annotation: anotacion, reuseIdentifier: reusarId)
anotacionView!.canShowCallout = true
anotacionView!.leftCalloutAccessoryView = UIImageView(image: UIImage(named: "Amarillo"))
}
else {
anotacionView!.annotation = anotacion
}
return anotacionView
}
let reusarId = "anotacion"
var anotacionView = mapaView.dequeueReusableAnnotationViewWithIdentifier(reusarId)
let costum = anotacion as! MKAnnotationCostum
if anotacionView == nil {
anotacionView = MKAnnotationView(annotation: costum, reuseIdentifier: reusarId)
//let costumView = anotacionView as! MKAnnotationCostum
if costum.tipo == "temp" {
anotacionView!.image = UIImage(named:"someImage")
} else {
anotacionView!.image = UIImage(named:"Amarillo")
}
anotacionView!.leftCalloutAccessoryView = UIImageView(image: UIImage(named: "marca"))
anotacionView!.canShowCallout = true
}else {
anotacionView!.annotation = anotacion
}
return anotacionView
}
代码不会提示任何错误,只是挂起while循环。它不打印任何东西。 这段代码可以正常使用" echo"这样的命令,所以我不知道我在这里做错了什么。
(如果你们有更好的建议来控制来自除ProcessBuilder以外的Java的c ++ exe进程中的i / o流,我很高兴)
提前致谢, Maarc~
答案 0 :(得分:0)
BufferedReader#readLine()
阻止,直到有完整的行可用,通过接收换行符表示。
您的C ++代码会打印提示但没有换行符。这会导致readLine()
无法返回,从而导致您看到的行为。如果您希望Java和C ++代码进行交互,则必须定义一个“协议”,以便在消息完成并准备好对其进行操作时进行通信。这可以像换行一样简单,如果您的需求不同则更复杂。这完全取决于你,但如果你正在处理一些现有的C ++程序并希望从Java控制它,你必须准备好处理它。
例如,如果C ++程序提示没有换行符而您无法更改,则可能需要在提示字符串的末尾查找冒号:
。这意味着Java代码不能使用readLine()
,并且必须一次处理一个字符输入。