【发布时间】:2015-05-28 15:52:03
【问题描述】:
我整天都在寻找解决方案,但没有任何结果。你是唯一的希望。
我必须做基于 bass.h 库的声音合成器。一切正常,直到我希望它播放单独的流。我决定在不同的线程上做:
void Synthezator::play(MonoStream *stream1, MonoStream *stream2)
{
threadParam data = {stream1, this};
threadParam data2 = {stream2, this};
int x = 6;
DWORD threadId;
DWORD threadId2;
//thread first (PlayThread, data);
//thread second (PlayThread, data2);
//first.join();
//second.join();
CreateThread(NULL, 0, PlayThread, (PVOID) &data, 0, &threadId);
CreateThread(NULL, 0, PlayThread, (PVOID) &data2, 0, &threadId2);
getchar();
}
(注释的也一样)
只有当两个线程都在工作时,崩溃才会随机发生(随机发生,而不是每次)。如果我评论其中一个 - 没有崩溃。
PlayThread 函数:
DWORD WINAPI Synthezator::PlayThread(PVOID data)
{
//cout << "kurwa";
int i=0;
threadParam* dataNew = (threadParam*) data;
dataNew->stream->SeekBegin();
while(!(dataNew->stream->eof()))
{
int no = 0;
note* a = dataNew->stream->Next(&no);
dataNew->pointer->PlayNote(a, no);
i++;
}
}
播放笔记:
void Synthezator::PlayNote(note* note, int count)
{
position = new double[count];
generatorParams params = {synthType, count, note, position, this};
HSTREAM SignalStream = BASS_StreamCreate (FREQUENCY, 1, 0, &Generator, ¶ms);
if (SignalStream == 0) throw " Cannot create stream";
if(note->sound != 0) {
if (!BASS_ChannelPlay (SignalStream, TRUE)) throw "Cannot play generated sample";
}
const int secinusecs = 1000000;
sleep(secinusecs*floor(note->duration)/1000000);
usleep(secinusecs*(note->duration-floor(note->duration)));
if(note->sound != 0) {
BASS_ChannelStop(SignalStream);
}
BASS_StreamFree(SignalStream);
delete [] position;
}
如果我评论这一行,就没有崩溃(但也没有声音):
if (!BASS_ChannelPlay (SignalStream, TRUE)) throw "Cannot play generated sample";
【问题讨论】:
-
从 PlayThread 中的第一个 cout 来看,您已经为此苦苦挣扎了一段时间:D
-
位置变量在哪里声明?由2个线程同时修改!
-
删除行“删除[]位置;”解决了这个问题。谢谢!
-
不,它没有 - 你现在有内存泄漏(内存已分配,没有人释放它)!
-
threadParam data和threadParam data2是 play() 中的局部变量。当比赛结束时,这些将不再有效。因此,如果您的线程在播放完成后访问它们,您将拥有 UB。虽然我猜这就是 getchar() 的意义所在。
标签: c++ multithreading crash