2013-05-26 70 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狀態。

相關問題