LINUX.ORG.RU

Нубовопрос, SDL

 , ,


0

1

Господа, такая ситуёвина - пишу нубопрограмму, которая должна раз в 5 минут (а может и раз в час, ещё не решил) читать текстовый файлик, делать вычисления и показывать две цифры на фоне красивой картинки (не сиськи). Дык вот т.к. программа должна работать под офф-топом, поэтому пишу её на SDL. Вроде 3 минуты писанины, но застрял на вот каком моменте - не знаю как правильно заставить её ничего не делать эти 5 минут (а может и час). Если юзать SDL_Delay(5 минут), то пропадает реакция на внешние раздразжители - программу тупо не закрыть до истечения делея. Я понимаю, что туплю и наверняка не туда смотрю вообще, но как я не извращался с SDL_Delay, выходит как-то хреново. Камрады, направьте на путь истинный - как быть?



Последнее исправление: toggetit (всего исправлений: 2)

нубоспособы

1. записывать во что-нибудь время последнего «делания» и проверять периодически (таймером) «а не пора еще делать делание?»
2. отделить в другой поток данную процедуру?

v0rbis ★★
()
Ответ на: комментарий от v0rbis

хм...

Про поток, это интересно. По поводу таймера - где почитать? И как это должно примерно выглядеть?

Для полноты картины пока сделано так:

while(!done)
{
    while( SDL_PollEvent( &event ) )
        {
             if( event.type == SDL_QUIT )
                  {
                        quit = true;
                        SDL_Delay(100);
                  }
        }
     computeSomething(); 
     render();
     SDL_Delay(задержка); 
}

toggetit
() автор топика
Ответ на: хм... от toggetit

перенеси вообще в цикл с поллингом евентов проверку сколько прошло времени с последнего computeSomething(); render(); и в конце обновление тиков на проверку.

man SDL_GetTicks наверное. давно (очень давно) не видел SDL изнутри

v0rbis ★★
()
Ответ на: комментарий от v0rbis

Ну попробую, конечно, но не совсем понял...

toggetit
() автор топика

Uint32 threshold = 60 * 60 * 1000;
Uint32 target_ticks = 0;

while(!done)
{
while( SDL_PollEvent( &event ) )
{

Uint32 ticks = SDL_GetTicks();
if(ticks >= target_ticks)
{
computeSomething();
render();

target_ticks = ticks + threshold;
}

if( event.type == SDL_QUIT )
{
quit = true;
SDL_Delay(100);
}
}

}



походу как-то так

v0rbis ★★
()
Ответ на: хм... от toggetit

http://www.libsdl.org/docs/html/time.html

Запускаешь таймер на 5 минут с коллбеком, который делает compute, а в это время параллельно дёргаешь PollEvent() в бесконечном цикле в main() (что и даёт обработку внешних событий).

schizoid ★★★
()
Ответ на: комментарий от schizoid

спасибулечки!

Большое спасибо! С таймером всё отлично работает. Вопрос закрываю.

toggetit
() автор топика

В SDL цикл пишется самостоятельно. Так вот просто установить булевскую переменную, что никакие события кроме SDL_Quit больше обрабатывать не надо. И не обрабатывать. Подождать нужное время можно с помощью таймера, если речь идёт о C++ и главном классе приложения - то указатель this передаётся в коллбек, и оттуда по прошествии времени дёргается метод makeTwoDigitsAndBustyGirl().

quiet_readonly ★★★★
()

В sdl есть возможность в цикле читать события. В цикле же делайте задержку, которая позволит процессу засыпать и при этом быть достаточно отзывчивой на событие.
Впрочем, так можно делать не только с sdl.

andreyu ★★★★★
()
Последнее исправление: andreyu (всего исправлений: 1)
Ответ на: комментарий от andreyu

Ну вот я сейчас в цикле события и читаю, но задержку сделал вне этого цикла, т.к. чаще всего он пуст (в случае моего приложения) и до неё просто не ходило

toggetit
() автор топика
Ответ на: комментарий от toggetit

Если вы ждете событие, то слип не нужен. Если вы опрашиваете пул событий, то задержка нужна.

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.