4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
|
|
1 | |
Функция WaitForMultipleObjects выбрасывает поток29.10.2013, 12:09. Показов 2907. Ответов 20
Метки нет (Все метки)
Всем привет. Создаю поток( пусть будет поток А ) и ожидаю события на WaitForMultipleObjects. Одновременно считываю из звуковой карты данные , после считывания 44100*2 байт сигнализирую потоку А, поток А в свою очередь начинает считать преобразование Фурье и выводить на экран. Сигнал происходит и после метки в 88200*2 байт и так же сигнализирует потоку А.
Проблема вся в том , что поток А не успевает всё посчитать , как приходит новое событие и почему то поток вылетает ( по карайней мере на бряки не реагирует ). Что делает функция WaitForMultipleObjects когда поступает очередное событие , а на ней никто не ожидает ? Использую DirectDraw и DirectSound.
0
|
29.10.2013, 12:09 | |
Ответы с готовыми решениями:
20
В какой библиотеке лежит функция WaitForMultipleObjects? Пайпы и WaitForMultipleObjects Какая низкоуровневая функция из Windows API вызывается когда создается поток thread ? Функция WaitForMultipleObjects |
Ушел с форума
|
|
29.10.2013, 12:18 | 2 |
Приведите минимальный код, воспроизводящий проблему.
Или хотя бы псевдокод.
0
|
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
|
||||||
29.10.2013, 12:23 [ТС] | 3 | |||||
Могу привести полностью код
0
|
Ушел с форума
|
|
29.10.2013, 12:32 | 4 |
Сигнатура функции потока неверная.
Она возвращает DWORD, а не int, и должна быть __stdcall. Поток успевает запуститься до того, как StartThread будет установлен в TRUE. Кстати, в каком месте код вылетает ? И как создаются event-ы ?
0
|
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
|
||||||
29.10.2013, 12:39 [ТС] | 5 | |||||
Спасибо учту.
События создаются так:
Забыл сказать. Вылетает не досчитав преобразование Фурье. И это не доступ к запрещённой области памяти. А просто вылетает(безмолвно). Я как понял винда сама завершает поток А, если тот не сидел на функции WaitForMultipleObjects , когда произошёл сигнал.
0
|
Ушел с форума
|
|
29.10.2013, 12:46 | 6 |
Нет, такого точно не может быть.
SetEvent просто устанавливает событие в сигнальное состояние и все. На код, который не ждет этого события, этот факт никак не влияет. А SOUND_BUFFER_SIZE чему равен, кстати ?
0
|
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
|
|
29.10.2013, 12:47 [ТС] | 7 |
Я тогда не понимаю, с чем это может быть связанно. Если уменьшить нагрузку на поток, то всё работает нормально.
Добавлено через 39 секунд #define SOUND_BUFFER_SIZE 44100 * 2
0
|
Ушел с форума
|
|
29.10.2013, 12:58 | 8 |
Ага, вот кое-что начинает вырисовываться.
Размер стека, который по умолчанию резервируется для каждого потока - 1 мегабайт. В Вашем коде есть парочка массивов на стеке, которые имеют подозрительно большой размер. Подсказка: попробуйте выделять их в динамической памяти. Симптомы очень похожи на переполнение стека.
0
|
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
|
||||||
29.10.2013, 16:31 [ТС] | 9 | |||||
Ещё раз самоутверждаюсь в вашей светлой голове. Сейчас попробую.
Добавлено через 9 минут Короче поток А, крутится здесь( в циклах):
Добавлено через 3 минуты Вообщем я походу зря панику навёл. Это он так долго походу считает ))))))))))) Мдя.... Добавлено через 1 минуту Да. ТАк и есть извиняюсь за свою тупость. Походу облом с ФФТ. Добавлено через 3 часа 13 минут А вы не знаете случаем, почему так долго может считаться два цикла 44100*44100 , это же не сильно много ?!
0
|
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
|
|
29.10.2013, 16:44 [ТС] | 11 |
Аналогичное делает знакомый, у него меньше чем за сек всё обрабатывает. Скидывал проект мне, тоже очень быстро считает. Тоже самое ФФт
0
|
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
|
||||||
29.10.2013, 17:16 [ТС] | 13 | |||||
Почему при выборе релиз , не хочет открывать #pragma comment(lib,"ddraw.lib") незнаете случаем почему ?
Друг пишет на С#, я под winAPI. Никаких флагов он не использует. Вот егошний код
0
|
29.10.2013, 17:21 | 14 |
Нет, не знаю.
А ты не заметил что у него другой алгоритм вычисления FFT ? Какой размер FFT использует он? Обычно, при вычислении FFT берут размер равный степени двойки, т.е. 256, 512, 1024.. куда тебе 44100 ?
0
|
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
|
|
29.10.2013, 17:27 [ТС] | 15 |
Какая разница какой размр брать? У меня в данном случае размер буфера звуковой карты.
0
|
29.10.2013, 17:29 | 16 |
Честно говоря, мне не хочется учить тебя тому, для чего используется FFT и где он применяется. Если ты сам этого не понимаешь тогда тебе стоит об этом побольше почитать, ну или спросить об этом друга.
0
|
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
|
|
29.10.2013, 17:51 [ТС] | 17 |
Если честно я знаю что такое ФФТ и знаю где оно применяется и применял уже не раз. ФФТ к твоему сведению считается по длительности сигнала. А она не всегда равна степени двойки !!!!!
0
|
29.10.2013, 18:20 | 18 |
Ну ты прям мне глаза открыл. Не знаю как и благодарить даже..
Существует куча оптимизированных алгоритмов для вычисления БПФ в реальном времени, и все они используют размер равный степени двойки. Ты же делаешь всё это через одно место.
0
|
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
|
|
29.10.2013, 18:23 [ТС] | 19 |
В плане оптимизации, не спорю надо что то думать. Может даже и SSE подключать сюда.
0
|
29.10.2013, 18:33 | 20 | |||||
Вот хорошая реализация с размером 2^n.
Кликните здесь для просмотра всего текста
0
|
29.10.2013, 18:33 | |
29.10.2013, 18:33 | |
Помогаю со студенческими работами здесь
20
Функция:выбрасывает из списка одинаковые элементы. Функция:выбрасывает из списка одинаковые элементы. Функция,выбрасывает из списка одинаковые элементы Функция rand() в обоих случаях выбрасывает одинаковые числа Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |