有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java LWJGL错误:GLFW只能在主线程上使用。此检查可以通过配置禁用。GLFW_检查_螺纹0

我正在尝试使用LWJGL创建一个窗口,它有一个线程game。当我尝试运行我的代码时,我得到一个错误:GLFW may only be used on the main thread. This check may be disabled with Configuration.GLFW_CHECK_THREAD0.。起初,它建议添加一个JVM参数-XstartOnFirstThread,我将IDE配置为这样做,但现在它建议:This check may be disabled with Configuration.GLFW_CHECK_THREAD0.。我该如何实现或以另一种方式修复它

梅因。爪哇:

package main;

import engine.io.Window;

public class Main implements Runnable {
    public Thread game;
    
    public static Window window;
    
    public static final int WIDTH = 1280, HEIGHT = 760;
    
    public void start() {
        game = new Thread(this, "game");
        game.start();
    }
    
    public static void init() {
        System.out.println("Initializing game!");
        window = new Window(WIDTH, HEIGHT, "game");
        
        window.create();
    }
    
    public void run() {
        init();
        while (true) {
            update();
            render();
        }
    }
    
    private void update() {
        System.out.println("Updating game");
    }
    
    private void render() {
        System.out.println("Rendering game");
    }
    
    public static void main(String[] args) {
        new Main().start();
    }
}

窗户。爪哇:

package engine.io;

import org.lwjgl.glfw.GLFW;
import org.lwjgl.glfw.GLFWVidMode;

public class Window {
    private int width, height;
    private String title;
    private long window;
    
    public Window(int width, int height, String title) {
        this.width = width;
        this.height = height;
        this.title = title;
    }
    
    public void create() {
        if (!GLFW.glfwInit()) {
            System.err.println("ERROR: GLFW wasn't initialized");
            return;
        }
        
        window = GLFW.glfwCreateWindow(width, height, title, 0, 0);
        
        if (window == 0) {
            System.err.println("ERROR: Window wasn't created");
            return;
        }
        
        GLFWVidMode videoMode = GLFW.glfwGetVideoMode(GLFW.glfwGetPrimaryMonitor());
        GLFW.glfwSetWindowPos(window, (videoMode.width() - width)/2, (videoMode.height() - height)/2);
        GLFW.glfwShowWindow(window);
    }
}

共 (1) 个答案

  1. # 1 楼答案

    您正在从单独生成的线程调用GLFW方法/函数。这在macOS上是不可能的。 参见GLFW自己的文档,例如“线程安全”部分下的glfwCreateWindow

    Thread safety

    This function must only be called from the main thread.

    大多数其他函数也是如此,如glfwInitglfwShowWindowglfwPollEvents/glfwWaitEvents等。请查阅GLFW的文档

    因此,大多数GLFW函数必须从main线程调用,该线程是最初调用main方法的JVM进程隐式创建的线程

    目前,程序中的主线程所做的唯一一件事就是生成一个新线程,然后它处于休眠状态,直到JVM退出。这是完全没有必要的。你也可以使用主线程来完成这项工作

    为了解决这个问题,只需不要生成/创建单独的线程