2013-11-23 3 views
0

У меня довольно простая проблема, которую я не могу решить.wxWidgets application loop slideshow

Я хотел бы написать программу слайд-шоу, которая также воспроизводит аудиофайл каждый раз, когда слайд изменился. Эти звуковые файлы различаются по длине, и я не хочу программировать цикл через следующую запись/изображение, пока звук не закончит воспроизведение.

В настоящее время я реализовал цикл:

void UI_BRAINWASH::PlaySound_top() 
{ 
wxString tmppath(parent->get_currentdirect()+parent->current_db.get_card(m_index)->get_topentryaudiopath()); 
ISound* firstsound = this->engine->play2D(tmppath.mb_str(), false, false, true); 
while(engine->isCurrentlyPlaying(tmppath.mb_str())) 
{ 
    StaticTextTop->GetParent()->Update(); 
    //wxSleep(3); 

} 
m_timer->Start(1000); 

}

и это перебирает записи, как и ожидалось, и все денди ...

Однако, я хотел бы, чтобы способный прервать программу, нажав Escape среди других вещей, но цикл while явно мешает мне делать именно это. Я также заметил, что я не могу переместить свое окно или закрыть программу, пока она просматривает изображения.

Итак, я посмотрел на темы и класс wxIdleevent. in: wxwidgets/samples/threads/является примером «рабочего потока», который, похоже, мне нужен.

Мой вопрос сейчас: это потоки, которые не являются излишним для простого слайд-шоу? Есть ли еще один лучший способ перебирать мои записи - ожидая, что звук сыграет, обновит gui, а также сможет все еще перемещать окно?

ответ

0

Что такое двигатель?

Большинство API-интерфейсов для воспроизведения звуков предоставляют возможность начать воспроизведение звукового файла, а затем немедленно вернуться. Они отправят событие, когда звук будет закончен. Они также обеспечат вызов прерывания звука, который все еще воспроизводится. Это то, что вы хотите.

Вы должны проверить документы для любого API, который вы используете, и найти эту функцию. Если функция недоступна, вам нужно найти другой API, который делает - большинство из них.