Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: mcrads от Декабрь 21, 2009, 18:48



Название: Как сделать ожидание нажатия кнопки?
Отправлено: mcrads от Декабрь 21, 2009, 18:48
Доброго времени суток. Вопрос такой.
Есть процедура в которой выполняется бесконечный цикл и он должен прерваться по нажатии кнопки стоп.

Загвоздка в том что когда мы уходим в бесконечный цикл - программа автоматически подвисает и не реагирует ни на что.
Возможно лучше переделать этот бесконечный цикл. но тогда вопрос - как лучше?
Подскажите пожалуйста!


Название: Re: Как сделать ожидание нажатия кнопки?
Отправлено: mcrads от Декабрь 21, 2009, 18:51
тут чуть ранее была тема про многопоточность, но мне кажется это не тот случай, не для меня....


Название: Re: Как сделать ожидание нажатия кнопки?
Отправлено: lit-uriy от Декабрь 21, 2009, 18:54
>>но мне кажется это не тот случай, не для меня
А почему ты так думаешь?


Название: Re: Как сделать ожидание нажатия кнопки?
Отправлено: Пантер от Декабрь 21, 2009, 18:55
Как вариант, можно в цикле вызывать QCoreApplication::processEvents().
Но лучше все таки поток.


Название: Re: Как сделать ожидание нажатия кнопки?
Отправлено: mcrads от Декабрь 21, 2009, 19:00
я новичок в кодинге =) и поток это пока для меня нечто уму непостижимое =))) но рискнуть можно.

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

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

я так это понимаю пока что.


Название: Re: Как сделать ожидание нажатия кнопки?
Отправлено: lit-uriy от Декабрь 21, 2009, 19:24
Если тебе цикл можно прервать жестко, то просто убьёшь поток и всё. Т.е. никаких сигналов не надо.


Название: Re: Как сделать ожидание нажатия кнопки?
Отправлено: Vass от Декабрь 21, 2009, 19:53
mcrads, лучше как писал Пантер, если с потоками связываться не хочешь, сигнал click от кнопки вешаешь на слот который будет выставлять флаг окончания, а в цикле
Код:
QCoreApplication::processEvents();
if (flag)
    break;

---
хотя, конечно, QCoreApplication::processEvents();
прилично замедлит выполнения цикла, но можно, например, вызывать его не каждую итерацию, а скажем раз в 1000 итераций.


Название: Re: Как сделать ожидание нажатия кнопки?
Отправлено: mcrads от Декабрь 21, 2009, 19:56
Но ведь это замедлит работу приложения незначительно (на сотки милисекунд)???

В то время как потоки похоже наоборот немного ускорят... хм... видимо придется с ними связаться...


Название: Re: Как сделать ожидание нажатия кнопки?
Отправлено: Vass от Декабрь 21, 2009, 20:02
Сотки миллисекунд на каждой итерации цикла ведут к значительному замедлению.

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


Название: Re: Как сделать ожидание нажатия кнопки?
Отправлено: mcrads от Декабрь 21, 2009, 20:05
Вот к такому же выводу я и пришел - ибо цикл КРАЙНЕ критичен к скорости.


Название: Re: Как сделать ожидание нажатия кнопки?
Отправлено: Dendy от Декабрь 21, 2009, 22:18
Можно засекать время:

Код
C++ (Qt)
QTime time_;
...
if ( time_.elapsed() >= 20 ) // trigger every 20 ms
{
   QCoreApplication::processEvents();
   if ( flag )
       break;
   time_.start();
}


Название: Re: Как сделать ожидание нажатия кнопки?
Отправлено: Igors от Декабрь 21, 2009, 22:53
Подобная тема недавно была
http://www.prog.org.ru/topic_11383_0.html (http://www.prog.org.ru/topic_11383_0.html)
processEvents не нужен если QProgressDialog модальный (тогда setValue само вызовет processEvents)
UPDATE_STEP нужно подбирать по месту (иначе будем работать на индикатор)


Название: Re: Как сделать ожидание нажатия кнопки?
Отправлено: mcrads от Декабрь 22, 2009, 19:37
Всем спасибо, с задачей справился, все работает =) заодно изучил потоки.