OpenAl Beep函数因更多线程而失败

时间:2015-09-09 06:56:51

标签: c++ c++11 openal beep

我尝试使用OpenAl编写Beep函数。但是只能运行该函数的几个线程。一段时间后,以下代码失败:

package test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class Client {

public Client() {
    // TODO Auto-generated constructor stub
}
public static void main(String args[]) throws Exception
{
    System.out.println("Client started");
    Socket sk=new Socket("localhost",8888);
    System.out.println("Client Connected");
    BufferedReader sin=new BufferedReader(new InputStreamReader(sk.getInputStream()));
    PrintStream sout=new PrintStream(sk.getOutputStream());
    BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
    String s;
    while (  true )
    {
        System.out.print("Client : ");
        s=stdin.readLine();
        sout.println(s);
        s=sin.readLine();
        System.out.print("Server : "+s+"\n");
        if ( s.equalsIgnoreCase("BYE") )
           break;
    }
     sk.close();
     sin.close();
     sout.close();
    stdin.close();
}
}

#include <cmath> #include <iostream> #include <thread> using namespace std; #include <AL/alut.h> // OpenAl void init_al() { const char *defname = alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER); ALCdevice* dev = alcOpenDevice(defname); ALCcontext *ctx = alcCreateContext(dev, NULL); alcMakeContextCurrent(ctx); } void exit_al() { ALCcontext* ctx = alcGetCurrentContext(); ALCdevice* dev = alcGetContextsDevice(ctx); alcMakeContextCurrent(0); alcDestroyContext(ctx); alcCloseDevice(dev); } void Beep(float freq = 440, float seconds = 0.5) { init_al(); ALuint buf; alGenBuffers(1, &buf); unsigned sample_rate = 10000; size_t buf_size = seconds * sample_rate; short* samples = new short[buf_size]; if(samples == 0) { cout<< "It seems there is no more heap memory. Sorry we cannot make a beep!"; } for(unsigned i = 0; i < buf_size; i++) samples[i] = 32760*sin(2*M_PI*i*freq/sample_rate); alBufferData(buf,AL_FORMAT_MONO16,samples,buf_size,sample_rate); ALuint src; alGenSources(1,&src); alSourcei(src,AL_BUFFER,buf); alSourcePlay(src); alutSleep(seconds + 0.5); delete[] samples; exit_al(); } int main() { for(int i = 1; i < 1000; i++) { thread t(Beep, 440,0.5); t.detach(); alutSleep(0.01); } } 功能出了什么问题?我该如何解决?

我在发生问题的正常程序中使用了此Beep函数。我在上面的程序中重现了错误。问题是Beep在一段时间后变得没有响应,即使你不管它几秒钟来完成它以前的任务。所以它使用了一些东西,并没有返回它。如果更改1000到20没有任何更改。

0 个答案:

没有答案