有 Java 编程相关的问题?

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

多线程Java线程,具有可视和音频

我正在创建一个小型Java应用程序,该应用程序需要连续连接到外围设备,一个跳跃动作,然后还显示视觉反馈。我还试图播放一系列基于用户输入的声音,通过跳跃动作。。。基本上,当某个值大于最小值时,播放声音

我特别需要帮助的是如何正确处理Java中的线程,如果我需要手动关闭它们

要使用LWJGL启动视觉显示,请启动如下线程:

Runnable newWindow = new ThreadedWindow();
new Thread(newWindow).start();

线程化窗口类由一个运行函数组成:

CreateWindow mainWindow = new CreateWindow();
mainWindow.startWindow();

startWindow函数只是做一些非常基本的OpenGL工作来创建一个空白窗口。我只是想知道这是否是为窗口创建和使用线程的正确方法,或者是否有其他更有效的方法

public class CreateWindow {

private int windowW = 1280;
private int windowH = 720;
private int windowCentreX = windowW/2;
private int windowCentreY = windowH/2;

public void startWindow()
{
    try {
        Display.setDisplayMode(new DisplayMode(1280,720));
        Display.create();
    } catch (LWJGLException e) {
        e.printStackTrace();
        System.exit(0);
    }

    //Init OpenGL Stuff
    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();
    GL11.glOrtho(0, 1280, 0, 720, 1, -1);
    GL11.glMatrixMode(GL11.GL_MODELVIEW);

    while(!Display.isCloseRequested()) {
        //Render the OpenGL Stuff
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); 

        // set the color of the quad (R,G,B,A)
        GL11.glColor3f(0.5f,0.5f,1.0f);

        float circleRadius = 50;
        float circleX = FingerInfo.averageFingerX;
        float circleY = FingerInfo.averageFingerY;

        // draw quad
        GL11.glBegin(GL11.GL_QUADS);
            GL11.glVertex2f(circleX + windowCentreX,circleY + windowCentreY);
            GL11.glVertex2f(circleX + windowCentreX + circleRadius,circleY + windowCentreY);
            GL11.glVertex2f(circleX + windowCentreX + circleRadius, circleY + windowCentreY + circleRadius);
            GL11.glVertex2f(circleX + windowCentreX,circleY + windowCentreY + circleRadius);
        GL11.glEnd();

        Display.update();
    }
    Display.destroy();
}

}

-

我正在创建的音频使用JavaX。声音midi。使用基本合成器和MIDI通道创建基本音调

public static void GenerateTone(int newNote)
{
    note = newNote;
    try
    {
        Synthesizer synth = MidiSystem.getSynthesizer();
        synth.open();
        MidiChannel channel = synth.getChannels()[0];
        for(int i=0; i < 1; i++)
        {
            channel.noteOn(note, 50);
            System.out.println("Generating new tone!");

        }
    } catch (MidiUnavailableException e) { 
        e.printStackTrace();
    }
}

我确实在一个run函数中调用了这个函数,该函数用于以类似于窗口的方式启动线程,但是重复播放大量声音,比如每秒10次,会导致声音暂停并发出大量嗡嗡声。这可能是一个与线程完全无关的问题,但是我只是想问一下,是否有一种好的方法可以在线程中播放声音。如果我需要处理声音播放后线程的破坏

谢谢:D


共 (1) 个答案

  1. # 1 楼答案

    LWJGL的developers of LWJGL themselves have specifically mentioned限制为单个图形上下文,即一次不超过一个OpenGL窗口或显示。因此,如果启动一个线程并创建第二个显示,可能会发生非常不幸的事情。否则,假设您只创建了一次窗口线程,它应该是完美的

    但是,如果您使用的是声音,并且希望同时播放多个声音,既然您使用的是LWJGL,为什么不使用LWJGL的OpenAL绑定呢?OpenAL完全能够在无需多线程的情况下同时播放多个声音,尽管您需要录制声音才能播放,但您可以在用于播放声音的函数中修改音高