Весь день я пытаюсь найти решение без каких-либо результатов. Ты единственная надежда.C++ Threads - Crashes
Я должен сделать звуковой синтезатор на основе библиотеки 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();
}
(комментируемые Ones работает таким же образом)
Аварии случайно встречается, (в случайные моменты времени, а не каждый раз) только тогда, когда два потока работают. Если я прокомментирую один из них - нет крушения.
функция 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++;
}
}
PlayNote:
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";
Судя по первому cout в PlayThread Вы некоторое время боролись с этим: D – AccessViolation
Где объявляется переменная позиции? Он модифицирован из двух потоков одновременно! – AccessViolation
Снятие линии «удалить [] позицию; решил проблему. Благодаря! – user1678401