gpt4 book ai didi

java - JME 中的线程不起作用

转载 作者:行者123 更新时间:2023-12-01 13:42:52 25 4
gpt4 key购买 nike

在 JME 中,我尝试使用线程,但是当我运行程序时,该函数永远不会启动。

我有一个服务器套接字正在监听来自 Netbeans 的输入。

监听器

while (isRunning) {
//Reads and prints the input
String receivedString = (String) in.readObject();

System.out.println(receivedString);

String[] parts = receivedString.split(";");

if(parts[0].equals("craneCon"))
{
final int containerId = Integer.parseInt(parts[1]);
m.enqueue(new Callable<Spatial>(){
public Spatial call() throws Exception{
m.removeContainersFromMaritime(containerId);
return null;
}
});
}

所以在main中有一个函数removeContainersFromMaritime

public void removeContainersFromMaritime(final int idContainer)
{
Node container = Maritime.listOfContainers.get(idContainer);

martime.detachChild(Maritime.listOfContainers.get(idContainer));
seagoingcrane.attachChild(Maritime.listOfContainers.get(idContainer));

container.setLocalTranslation(0,5,0);
System.out.println(Maritime.listOfContainers.get(0).getWorldTranslation().z);

}

连接正常,但该方法从未执行。我该如何解决这个问题?

最佳答案

jMonkeyEngine 使用 Swing 式线程模型,其中有一个渲染线程可以完成所有工作。对场景图的任何更改都必须从该渲染线程完成。

要进入渲染线程,您可以实现 AppStatesControls 或者您可以 enqueue Callable然后以与 Swing 的 invokeLater 类似的方式在渲染线程上执行。

您发布的代码片段看起来是正确的,因此假设 m 是您正在运行的 jME3 SimpleApplication,那么 m.enqueue() 将导致排队的可调用对象下次在渲染循环周围执行(即在下一帧开始时) .

如果您没有看到它被执行,那么:

  1. 您的应用程序未运行
  2. 您创建了多个应用程序并将其排入错误的队列
  3. 代码实际上正在运行,而您只是认为它没有运行。

单步执行调试器中的代码和/或添加调试语句(例如在 removeContainersFromMaritime 内设置断点以查看它是否实际被调用,应该可以让您缩小范围。

关于java - JME 中的线程不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20566343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com