Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Вопрос по таймерам [c++]  (Прочитано 5537 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн 69LoG

  • Автор темы
  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Вопрос по таймерам [c++]
« : 25 Июня 2009, 18:11:23 »
В общем проблема в следующем. Имеется программа, имеется цикл типа:
while (true)
{
  // какие-то действия.
}
И нужно через определенное время прервать этот цикл. Аля:
while (true)
{
  // какие-то действия.
  if (прошло 10 сек) break;
}
Как такое можно реализовать. Есть мысля на счет сеттаймер, ну тода пример если можно, бо что-то я не разберусь никак.
Приложение консольное.

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Вопрос по таймерам [c++]
« Ответ #1 : 25 Июня 2009, 19:33:56 »
alarm, setitimer.
Примеры легко находятся в гугле.
http://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi?az=show_thread&omm=&om=4434&forum=vsluhforumID9

можно поступить вообще просто:

time_t stop_time=time(NULL)+10;

while (true)
{
  // какие-то действия.
  time_t cur_time=time(NULL);
  if (cur_time >= stop_time) break;
}

Если задержки должны быть милисекундые, то этот вариант не подойдет, но можно сделать аналогично с gettimeofday()
« Последнее редактирование: 25 Июня 2009, 20:28:19 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн 69LoG

  • Автор темы
  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Re: Вопрос по таймерам [c++]
« Ответ #2 : 25 Июня 2009, 20:13:14 »
time_t stop_time=time()+10;

while (true)
{
  time_t cur_time=time();
  // какие-то действия.
  if (cur_time >= stop_time) break;
}
Вот такой вариант интересен. Попробуем.

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Re: Вопрос по таймерам [c++]
« Ответ #3 : 25 Июня 2009, 20:19:42 »
И чтого тут интересного? :-\
Извините, я все еще учусь

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Вопрос по таймерам [c++]
« Ответ #4 : 25 Июня 2009, 20:26:19 »
Да, в общем-то, ничего.
Надо понимать, что силового завершения тут не будет, т.е. если цикл застрянет в каких-то действиях, то до break он доберется только после того, как они закончатся.
И время надо опрашивать непосредственно перед проверкой.
Сейчас поправлю предыдцщее сообщение.
« Последнее редактирование: 25 Июня 2009, 20:28:02 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн 69LoG

  • Автор темы
  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Re: Вопрос по таймерам [c++]
« Ответ #5 : 25 Июня 2009, 20:47:36 »
Я не против, что интересного тут мало. Просто первый раз под линуксом пишу, а спросить некого.

Пользователь решил продолжить мысль 26 Июня 2009, 18:14:57:
Блин. Такой вариант не проходит. Нужно именно как нить насильно завершить цикл. Мне говорили можно сделать через таймер и обработчик получаемого в результате сигнала. Тока как это сделать...
« Последнее редактирование: 26 Июня 2009, 18:14:57 от 69LoG »

Оффлайн maximum2000

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: Вопрос по таймерам [c++]
« Ответ #6 : 26 Июня 2009, 20:46:42 »
Нет,  - нужно использовать программые потоки и точка.
Примеры "таймеров" есть и в на pThread  и на  BOOST C++ .
Лично я пользуюсь библиотекой ZThread.

А ваши примеры грузят процессор  на 100% !!! - так нельзя.

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Вопрос по таймерам [c++]
« Ответ #7 : 26 Июня 2009, 21:44:44 »
Тогда Вам понадобятся функции из библиотеки pthreads (pthread_create, pthread_cancel и т.п.), а также alarm или setitimer.

Цикл оформляем в функции и запускаем ее отдельным потоком, в другом потоке ставим alarm, чтобы прислали сигнал в нужное время. Там же или в третьем потоке опрашиваем сигналы и выставляем флаги, мол, надо вызвать pthread_cancel.
Как-то так...

Литература по теме

Вероятно, все же можно и предыдущий вариант доработать: побить "какие-то действия" на маленькие куски и после каждого куска выполнять проверку не пора ли завершаться. Все зависит от действий, насколько они контролируемы.
« Последнее редактирование: 26 Июня 2009, 21:48:32 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн 69LoG

  • Автор темы
  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Re: Вопрос по таймерам [c++]
« Ответ #8 : 26 Июня 2009, 22:00:47 »
У меня идея такая (проверить смогу только пожже, ибо для проги нужны либы которые есть только на фирме...):
void op(int sig_num)

  longjmp(Env, 1);
};
int main)
{
    ...
    signal(SIGALRM, op);
    alarm(10);

    if (setjmp(Env) != 0) {    
        goto <делаем что еще нада ..  exit(1)>;
    }
    while (1)
    {
      // какие-то действие, на котором стоит прога. те именно стоит, а не бегает по циклу
    }
}
Так не покатит ???
« Последнее редактирование: 26 Июня 2009, 22:10:17 от 69LoG »

Оффлайн maximum2000

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: Вопрос по таймерам [c++]
« Ответ #9 : 26 Июня 2009, 23:53:44 »
Тогда Вам понадобятся функции из библиотеки pthreads (pthread_create, pthread_cancel и т.п.), а также alarm или setitimer.

pthreads - напрочь потеряем переносимость. См. пост выше.

Пользователь решил продолжить мысль 26 Июня 2009, 23:57:51:
У меня идея такая (проверить смогу только пожже, ибо для проги нужны либы которые есть только на фирме...):

Извините, а вы посты с ответами не читаете, да? Однозначно, используйте потоки, это абсолбтно нормальное и стандартное решение. Если хотите чтобы программа компилилась и под Linux и под Windows, используйте кросс платформенные библиотеки. OpenThreads, BOOST Threads, ZThreads  и т.д. Описанная Вами задача решается достаточно просто. Описание есть в документации на эти библиотеки.
« Последнее редактирование: 26 Июня 2009, 23:57:52 от maximum2000 »

Оффлайн 69LoG

  • Автор темы
  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Re: Вопрос по таймерам [c++]
« Ответ #10 : 27 Июня 2009, 00:27:02 »
Использование потоков усложнит задачу. Основная проблема будет, в их синхронизации. 100 % можно обойтись без них.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Вопрос по таймерам [c++]
« Ответ #11 : 27 Июня 2009, 08:27:37 »
Кто сказал что pthread не портабелен? pthread = POSIX Thread. Знаешь как POSIX расшифровывается? ;)
pthread есть на винде http://sourceware.org/pthreads-win32/


Оффлайн maximum2000

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: Вопрос по таймерам [c++]
« Ответ #12 : 27 Июня 2009, 11:43:48 »
Кто сказал что pthread не портабелен? pthread = POSIX Thread. Знаешь как POSIX расшифровывается? ;)
pthread есть на винде http://sourceware.org/pthreads-win32/


хм. действительно. Просто не втречал я его под Windows) Будем знать.


Цитировать
Использование потоков усложнит задачу. Основная проблема будет, в их синхронизации. 100 % можно обойтись без них.

А программа, которая "вешает" систему и процессор на 100% - это правильно?!



Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Вопрос по таймерам [c++]
« Ответ #13 : 28 Июня 2009, 15:44:49 »
maximum2000, любой thread с тем же успехом может загрузить проц на 100%
У тебя какие-то странные понятия =)

Все что не грузит проц использует блокирующий ввод/вывод. Если надо обработать огромный объём данных тут уж ни чего не попишешь, чтобы успеть быстрее будем грузить проц на 100% (а нафига он вообще простаивает?).
Другое дело что это все можно пустить в потоке с более низким приоритетом.
Тогда сразу так бы и говорил, а просто потоки тебя ничем не спасут.

Оффлайн 69LoG

  • Автор темы
  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Re: Вопрос по таймерам [c++]
« Ответ #14 : 28 Июня 2009, 20:20:49 »
Цитировать
А программа, которая "вешает" систему и процессор на 100% - это правильно?!
А в том и дело, что она не вешает систему. И проц она не грузит. Она ждет ответа от устройства и все. В итоге цикл не продвигается.
Завтра попробую поиграться setjmp/longjmp.

 

Страница сгенерирована за 0.066 секунд. Запросов: 25.