Название: Как сделать ожидание нажатия кнопки? Отправлено: 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; в другом потоке реализовываем слот который на нажатие стопа ставит key на false? я так это понимаю пока что. Название: Re: Как сделать ожидание нажатия кнопки? Отправлено: lit-uriy от Декабрь 21, 2009, 19:24 Если тебе цикл можно прервать жестко, то просто убьёшь поток и всё. Т.е. никаких сигналов не надо.
Название: Re: Как сделать ожидание нажатия кнопки? Отправлено: Vass от Декабрь 21, 2009, 19:53 mcrads, лучше как писал Пантер, если с потоками связываться не хочешь, сигнал click от кнопки вешаешь на слот который будет выставлять флаг окончания, а в цикле
Код: QCoreApplication::processEvents(); --- хотя, конечно, 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 Можно засекать время:
Код
Название: 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 Всем спасибо, с задачей справился, все работает =) заодно изучил потоки.
|