Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: wolfut от Август 30, 2011, 08:18



Название: sleep() без зависания интерфейса
Отправлено: wolfut от Август 30, 2011, 08:18
Доброго времени суток!

Можно ли в Qt остановить выполнение программы на промежуток времени, без зависания интерфейса?


Название: Re: sleep() без зависания интерфейса
Отправлено: popper от Август 30, 2011, 08:43
скорее всего, задача неправильно сформулирована. что значит "без зависания интерфейса"? подразумевается, что GUI-элементы активны и реагируют, например, на нажатие мыши? в этом случае главный поток программы должен работать.
если нужно остановить выполнение некоторого алгоритма, то он может быть вынесен в отдельный поток, который может быть остановлен.


Название: Re: sleep() без зависания интерфейса
Отправлено: wolfut от Август 30, 2011, 09:28
Это понятно, что можно в другом потоке, я просто хочу воспользоваться чем-нибудь другим.........например бесконечный цикл, внутри которого вызывается QApplication::processEvents(), только время определенное не задашь так


Название: Re: sleep() без зависания интерфейса
Отправлено: Bepec от Август 30, 2011, 09:31
Твой вариант конечно кривоват, но возможен.

Задай время в количестве слипов (каждые скажем полсекунды processEvent), хочешь на секунд 30. Делаешь цикл с условием на 60 повторений и вуаля.

PS хотя я больше потокам доверяю.

Подумал немного(редкий случай  ::)) - выход прост.

Разбей основную обработку на 2. Данные сохраняй с позицией обработки, и во время паузы просто останавливай 1 функцию. Как пауза пройдет(таймер), запускай вторую, продолжающую обработку.

PS идеал - 1 функция, которая при смене флага заканчивает обработку элемента и останавливает работу. При повторном вызове продолжает обработку начиная со следующего элемента .


Название: Re: sleep() без зависания интерфейса
Отправлено: Igors от Август 30, 2011, 10:36
У processEvents есть флажок ждать событие (если его пока нет). Послать самому себе событие таймера и поймать его через  processEvents


Название: Re: sleep() без зависания интерфейса
Отправлено: GreatSnake от Август 30, 2011, 10:51
Только не мешало бы ещё дропать все мышиные/клавиатурные нажатия и закрытия окон.


Название: Re: sleep() без зависания интерфейса
Отправлено: Igors от Август 30, 2011, 11:22
Только не мешало бы ещё дропать все мышиные/клавиатурные нажатия и закрытия окон.
И для этого флажок имеется  :)


Название: Re: sleep() без зависания интерфейса
Отправлено: GreatSnake от Август 30, 2011, 11:38
Цитировать
И для этого флажок имеется  :)
Имеется, только вот эвенты остаются в очереди :)
Цитата: assistant
Note that the events are not discarded; they will be delivered the next time processEvents() is called without the ExcludeUserInputEvents flag.


Название: Re: sleep() без зависания интерфейса
Отправлено: BRE от Август 30, 2011, 11:59
А разве эти события возможны в очереди событий не главного потока?
Если их туда самому не отправлять. ;)


Название: Re: sleep() без зависания интерфейса
Отправлено: GreatSnake от Август 30, 2011, 12:02
А разве эти события возможны в очереди событий не главного потока?
Если их туда самому не отправлять. ;)
А разве ТС хочет это делать не в главном потоке? ;)


Название: Re: sleep() без зависания интерфейса
Отправлено: BRE от Август 30, 2011, 12:08
А разве ТС хочет это делать не в главном потоке? ;)
Точно, а по первому посту я этого не понял... Сори ;)



Название: Re: sleep() без зависания интерфейса
Отправлено: zenden от Август 30, 2011, 12:13
Код
C++ (Qt)
QEventLoop q;
QTimer t;
t.setSingleShot(true);
connect(&t, SIGNAL(timeout()), &q, SLOT(quit()));
t.start(5000); // 5s timeout
q.exec();