Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2009, 22:05   #1
abr_question
Пользователь
 
Регистрация: 15.01.2008
Сообщений: 32
По умолчанию Задержка в программе на gtk

Очень надеюсь найти здесь кого-нть из программистов на gtk+.
Постановка задачи: есть цикл, выполняющие действия, написанный на обычном c. В етот цикл необходимо вставить задержку на 100-200 мксек, но так, чтобы программа отвечала на внешние раздражители.
Если поставить в коде usleep или sleep, то программа, пока не выполнит цикл, не откликается на системные вызовы и "повисает". Программу перевожу из Delphi, там ето сделать можно добавив строчку Application.ProcessMessages - тогда во время выполнения sleep программа может ловить клики мышки, клавиатурные движения и прочее...
Если не туда постучался, то звыняюсь.. Просто по gtk вобще мало где мануала по данной теме...
abr_question вне форума Ответить с цитированием
Старый 20.12.2009, 22:15   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Application.ProcessMessages - тогда во время выполнения sleep программа может ловить клики мышки, клавиатурные движения и прочее...
Ну вот это ерунда.
В GTK+ я не силен, но вопрос в корне не ясен, Вы говорите
Цитата:
Задержка в программе
а потом пишите
Цитата:
то программа, пока не выполнит цикл, не откликается на системные вызовы и "повисает"
Не вижу логики. Вам надо и одновременно остановить приложение, и в тоже время чтобы оно работало
BOBAH13 вне форума Ответить с цитированием
Старый 20.12.2009, 23:19   #3
abr_question
Пользователь
 
Регистрация: 15.01.2008
Сообщений: 32
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Не вижу логики. Вам надо и одновременно остановить приложение, и в тоже время чтобы оно работало
Видимо, не верно высказался. Не приложение остановить, а всего лиш приостановить выполнение одной процедуры на время.
abr_question вне форума Ответить с цитированием
Старый 21.12.2009, 00:14   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

На чистом "русском"
Код:
// do something before and now
DWORD k = GetTickCount();
for(;;)
{
  if(GetTickCount() - k >= 5000)
  {
    break; // т.е. подождали 5 секунд
  }
  Sleep(0); // WinAPI Sleep, т.е. пропускаем квант времени
}
Думаю сообразите как аналоги в GTK использовать. Думаю сработает, разумеется если время не имеется ввиду часы или минуты. И то думаю что можно найти более изящный способ. Например вывести в несколько потоков то что Вы там делаете.
BOBAH13 вне форума Ответить с цитированием
Старый 21.12.2009, 00:58   #5
abr_question
Пользователь
 
Регистрация: 15.01.2008
Сообщений: 32
По умолчанию

BOBAH13, циклы такого типа тоже не помогают, потому что при зацикливании процедуры, сообщения из вне тоже не обрабатываются.
В общем, я разнёс цикл на три части, причём тело цикла вызывается по таймеру. Ето лучшее, что мог сделать. А вот мысль насчёт потоков - в точку. Зря я с них не начал прогу свою писать.. Но подучить их стоит в будущем. Спасибо
abr_question вне форума Ответить с цитированием
Старый 21.12.2009, 01:37   #6
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

abr_question, Вы можете вызвать, например:
Код:
gboolean gtk_main_iteration_do (gboolean blocking);
Эта функция заставляет "прокрутится" главный цикл GTK приложения. В случае, если имеются какие либо необработанные сообщения или события - они обработаются.
Параметр blocking определяет следующее поведение:
TRUE - заблокирует приложение до тех пор, пока не произойдет какое либо событие.
FALSE - продолжит выполнение приложения, сразу же возвратившись из функции.
Есть так же функция
Код:
gboolean gtk_main_iteration (void);
Это тоже самое, что и предыдущая функция, с параметром blocking, всегда равным TRUE.

Но как уже выше сказали - потоки рулят. Вызов принудительной обработки событий из длительного вычислительного цикла - костыль
oleg kutkov вне форума Ответить с цитированием
Старый 21.12.2009, 23:54   #7
abr_question
Пользователь
 
Регистрация: 15.01.2008
Сообщений: 32
По умолчанию

Цитата:
Сообщение от oleg kutkov Посмотреть сообщение
abr_question, Вы можете вызвать, например:
Код:
gboolean gtk_main_iteration_do (gboolean blocking);
Эта функция заставляет "прокрутится" главный цикл GTK приложения. В случае, если имеются какие либо необработанные сообщения или события - они обработаются.
Параметр blocking определяет следующее поведение:
TRUE - заблокирует приложение до тех пор, пока не произойдет какое либо событие.
FALSE - продолжит выполнение приложения, сразу же возвратившись из функции.
Есть так же функция
Код:
gboolean gtk_main_iteration (void);
Это тоже самое, что и предыдущая функция, с параметром blocking, всегда равным TRUE.

Но как уже выше сказали - потоки рулят. Вызов принудительной обработки событий из длительного вычислительного цикла - костыль
Спасибо! Думаю, всё же, знать ету функцию полезно будет
abr_question вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кроссплатформенный анимированный осциллограф (GTK+, Cairo) oleg kutkov Qt и кроссплатформенное программирование С/С++ 15 22.10.2015 20:13
gtk+glade+c heart C++ Builder 16 13.12.2009 17:08
обновление в блоге - Кроссплатформенный анимированный осциллограф (GTK+, Cairo) Pblog Обсуждение статей 0 16.08.2009 16:00
Задержка JRcoker Общие вопросы Delphi 11 08.08.2008 00:38
Задержка Syred Общие вопросы Delphi 2 07.06.2008 08:16