Russian Qt Forum
Май 16, 2024, 16:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сделать ожидание нажатия кнопки?  (Прочитано 13453 раз)
mcrads
Гость
« : Декабрь 21, 2009, 18:48 »

Доброго времени суток. Вопрос такой.
Есть процедура в которой выполняется бесконечный цикл и он должен прерваться по нажатии кнопки стоп.

Загвоздка в том что когда мы уходим в бесконечный цикл - программа автоматически подвисает и не реагирует ни на что.
Возможно лучше переделать этот бесконечный цикл. но тогда вопрос - как лучше?
Подскажите пожалуйста!
Записан
mcrads
Гость
« Ответ #1 : Декабрь 21, 2009, 18:51 »

тут чуть ранее была тема про многопоточность, но мне кажется это не тот случай, не для меня....
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Декабрь 21, 2009, 18:54 »

>>но мне кажется это не тот случай, не для меня
А почему ты так думаешь?
Записан

Юра.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Декабрь 21, 2009, 18:55 »

Как вариант, можно в цикле вызывать QCoreApplication::processEvents().
Но лучше все таки поток.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
mcrads
Гость
« Ответ #4 : Декабрь 21, 2009, 19:00 »

я новичок в кодинге =) и поток это пока для меня нечто уму непостижимое =))) но рискнуть можно.

допустим (на словах) это выглядеть будет так:
В одном потоке
Код:
key = false;
while (true)
{
бла бла
if (key)
{
break
}
}

в другом потоке реализовываем слот который на нажатие стопа ставит key на false?

я так это понимаю пока что.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Декабрь 21, 2009, 19:24 »

Если тебе цикл можно прервать жестко, то просто убьёшь поток и всё. Т.е. никаких сигналов не надо.
Записан

Юра.
Vass
Гость
« Ответ #6 : Декабрь 21, 2009, 19:53 »

mcrads, лучше как писал Пантер, если с потоками связываться не хочешь, сигнал click от кнопки вешаешь на слот который будет выставлять флаг окончания, а в цикле
Код:
QCoreApplication::processEvents();
if (flag)
    break;

---
хотя, конечно, QCoreApplication::processEvents();
прилично замедлит выполнения цикла, но можно, например, вызывать его не каждую итерацию, а скажем раз в 1000 итераций.
« Последнее редактирование: Декабрь 21, 2009, 19:55 от Vass » Записан
mcrads
Гость
« Ответ #7 : Декабрь 21, 2009, 19:56 »

Но ведь это замедлит работу приложения незначительно (на сотки милисекунд)Непонимающий

В то время как потоки похоже наоборот немного ускорят... хм... видимо придется с ними связаться...
Записан
Vass
Гость
« Ответ #8 : Декабрь 21, 2009, 20:02 »

Сотки миллисекунд на каждой итерации цикла ведут к значительному замедлению.

Вообще это можно использовать, если Ваш бесконечный цикл не критичен к скорости. Ну я не знаю ждет он там событие какое-то ждет. Если же цикл используется для каких-то расчетов, передачи данных или еще чего-то подобного, то лучше все-таки вынести в отдельный поток.
Записан
mcrads
Гость
« Ответ #9 : Декабрь 21, 2009, 20:05 »

Вот к такому же выводу я и пришел - ибо цикл КРАЙНЕ критичен к скорости.
Записан
Dendy
Гость
« Ответ #10 : Декабрь 21, 2009, 22:18 »

Можно засекать время:

Код
C++ (Qt)
QTime time_;
...
if ( time_.elapsed() >= 20 ) // trigger every 20 ms
{
   QCoreApplication::processEvents();
   if ( flag )
       break;
   time_.start();
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Декабрь 21, 2009, 22:53 »

Подобная тема недавно была
http://www.prog.org.ru/topic_11383_0.html
processEvents не нужен если QProgressDialog модальный (тогда setValue само вызовет processEvents)
UPDATE_STEP нужно подбирать по месту (иначе будем работать на индикатор)
Записан
mcrads
Гость
« Ответ #12 : Декабрь 22, 2009, 19:37 »

Всем спасибо, с задачей справился, все работает =) заодно изучил потоки.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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