Бесконечный цикл перед PeekMessage

284
11 июля 2017, 21:35

Всем доброй ночи. Все-таки не успокоюсь, пока не решу окончательно одну проблему. В этот раз постараюсь получше изъяснится, т.к. в прошлый никто не помог, да и в общем, проблему не так поняли. Вот вам тело одной ф-ции:

auto sound = audio_system->LoadSound("gong.ogg");
        sound->SetVolume(0.05f);
        sound->Play();

MSG msg = {0};
        while(sound->IsPlaying() == true)
        {
            while(msg.message != WM_QUIT)
            {
                audio_system->Streaming(*sound);
                if(PeekMessage(&msg, nullptr, 0U, 0U, PM_REMOVE))
                {
                    TranslateMessage(&msg);
                    DispatchMessage(&msg);
                }
                else
                    break;
                if(msg.message == WM_QUIT)
                    return;
            }
        }

Знаю, это ни словами, ни матом не описать, но только вот это все решает мою an issue. В консольных apps все ok, да вот с Win32, что-то не так. Это AcousticsLib, если кому-то полезней знать, чтобы решить задачу. Только перед стриимингом можно изменить громкось, источника, вот поэтому я с этим хочу попарится. В общем-то, audio_system->Streaming(*sound); должен быть в true-цикле, пока играет один sound. Иначе, он попросту не будет играть. Streaming не дает обновляться окну, пока он не завепшит playSound. Это единственный код, что у меня работает. Потоки либо не давали никакого эффекта, либо программа крэшилась. Причем это один sound, а что если я два и более захочу? Хотелось бы:

PlayTestSound(); // здесь playSound, собственно
Window->update(); // здесь прием сообщений

Надеюсь, во второй раз мне помогут разобраться с этим. Спасибо.

Answer 1

Благодаря @KoVadim и его совету об отдельном потоке, у меня вышел рабочий код, который не задерживается в цикле стримминга и выглядит не так ужасно. Это элементарно с помощью std::thread и его методе join:

auto foo_lambda = [] ()
{
    auto sound = ac_lib->LoadSound("gong.ogg");
        sound->SetVolume(0.5f); // Теперь есть возможность изменить громкость источника
        sound->Play();
        while(sound->IsPlaying())
        {
            ac_lib->Streaming(*sound);
        }
};
std::thread thr1(foo); // Create thread.
window()->update(); // Update window.
thr1.join(); // Joining thread.

Не смотрите, что загрузка и воспроизведение в одной лямбде, все это для краткости. Как видите необходим современный компилятор с поддержкой std::thread и лябмд. И окно события принимает и стримминг происходит. Большое спасибо @KoVadim за наводку. Изучайте многопоточность.

READ ALSO
Наиболее точный вариант таймера для MFC C++

Наиболее точный вариант таймера для MFC C++

Уважаемые коллеги! В моем приложении MFC должна выводится некоторая строка в list control через некоторый промежуток времени от 50 до 1000 миллисекунд

271
Какие методы и операторы необходимы для использования типа в качестве параметра стандартного шаблонного контейнера?

Какие методы и операторы необходимы для использования типа в качестве параметра стандартного шаблонного контейнера?

Какие методы и операторы необходимы для использования типа в качестве параметра стандартного шаблонного контейнера?

213
Ошибка event.js:160 throw er // unhandled 'error' event gulp

Ошибка event.js:160 throw er // unhandled 'error' event gulp

Ошибка появилась после использования mmenu и hamburgers css

431
“улучшение” input range

“улучшение” input range

Сделал <input type="range" value="0" min="-50" max="50" step="1"/> Хотелось бы его модернизировать добавив пару интересных плюшек: 1Если щёлкнуть по инпуту с зажатым...

270