2013-05-26 42 views
2

我有一个LibGDX应用程序,在该应用程序中绘制了一个线程,并为客户端或服务器创建了一个线程。连接使用Kryonet完成。当你的对手创建做了一个消息,收到临客这样:从另一个线程中的对象运行方法

public void received(Connection con, Object object) { 

          TroopMessage tm = (TroopMessage)object;       
          fortress.map.addSoldier(tm.kind, true); 
          System.out.println("recieved"); 

          connection = con; 
} 

当这个回调是所谓的(它是正确的),我得到“没有在当前线程中的OpenGL上下文”。我认为它正在寻找MyClient Thread中的对象堡垒。我想调用fortress.map.addSoldier,它引用另一个线程中当前存在的对象。

public class Fortress extends Game implements ApplicationListener{ 
    private OrthographicCamera camera; 
    private SpriteBatch batcher; 

    public static MyServer server; 
    public static MyClient client; 

    public static Map map; 
[....] 

如何从另一个线程调用方法?

在此先感谢

+1

“对象”不属于或存在于特定线程中,因此这里不是问题。 – Keppil

+0

你试过搜索吗? http://stackoverflow.com/questions/14347340/no-opengl-context-found-in-the-current-thread-how-do-i-fix-this-error – rethab

+0

是的,我已经看到,但他们谈论“所以你只能从同一个线程访问这个上下文”。我怎样才能做到这一点? – yafrack

回答

4

在Libgdx你可以使用Gdx.app.postRunnable(Runnable r)问主渲染线程运行一些代码有OpenGL的上下文。请参阅Libgdx wiki有关应用程序线程的示例:https://code.google.com/p/libgdx/wiki/ApplicationThreading

正如注释所指出的,通常Java对象不是由线程“拥有”。 “OpenGL上下文”是一个例外,因为只有一个线程被允许更改OpenGL状态。

相关问题