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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: sleep() без зависания интерфейса  (Прочитано 8556 раз)
wolfut
Гость
« : Август 30, 2011, 08:18 »

Доброго времени суток!

Можно ли в Qt остановить выполнение программы на промежуток времени, без зависания интерфейса?
Записан
popper
Гость
« Ответ #1 : Август 30, 2011, 08:43 »

скорее всего, задача неправильно сформулирована. что значит "без зависания интерфейса"? подразумевается, что GUI-элементы активны и реагируют, например, на нажатие мыши? в этом случае главный поток программы должен работать.
если нужно остановить выполнение некоторого алгоритма, то он может быть вынесен в отдельный поток, который может быть остановлен.
Записан
wolfut
Гость
« Ответ #2 : Август 30, 2011, 09:28 »

Это понятно, что можно в другом потоке, я просто хочу воспользоваться чем-нибудь другим.........например бесконечный цикл, внутри которого вызывается QApplication::processEvents(), только время определенное не задашь так
Записан
Bepec
Гость
« Ответ #3 : Август 30, 2011, 09:31 »

Твой вариант конечно кривоват, но возможен.

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

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

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

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

PS идеал - 1 функция, которая при смене флага заканчивает обработку элемента и останавливает работу. При повторном вызове продолжает обработку начиная со следующего элемента .
« Последнее редактирование: Август 30, 2011, 09:57 от Bepec » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Август 30, 2011, 10:36 »

У processEvents есть флажок ждать событие (если его пока нет). Послать самому себе событие таймера и поймать его через  processEvents
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Август 30, 2011, 10:51 »

Только не мешало бы ещё дропать все мышиные/клавиатурные нажатия и закрытия окон.
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Август 30, 2011, 11:22 »

Только не мешало бы ещё дропать все мышиные/клавиатурные нажатия и закрытия окон.
И для этого флажок имеется  Улыбающийся
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Август 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.
« Последнее редактирование: Август 30, 2011, 11:41 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
BRE
Гость
« Ответ #8 : Август 30, 2011, 11:59 »

А разве эти события возможны в очереди событий не главного потока?
Если их туда самому не отправлять. Подмигивающий
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Август 30, 2011, 12:02 »

А разве эти события возможны в очереди событий не главного потока?
Если их туда самому не отправлять. Подмигивающий
А разве ТС хочет это делать не в главном потоке? Подмигивающий
Записан

Qt 5.11/4.8.7 (X11/Win)
BRE
Гость
« Ответ #10 : Август 30, 2011, 12:08 »

А разве ТС хочет это делать не в главном потоке? Подмигивающий
Точно, а по первому посту я этого не понял... Сори Подмигивающий

Записан
zenden
Гость
« Ответ #11 : Август 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();
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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