Russian Qt Forum

Qt => Общие вопросы => Тема начата: Turing от Февраль 02, 2006, 07:59



Название: Пауза (задержка) на QT 4.1.0
Отправлено: Turing от Февраль 02, 2006, 07:59
Кто-нить знает как реализовать паузу (задержку на n секунд) в программме написанной на Qt 4.1.0???


Название: Пауза (задержка) на QT 4.1.0
Отправлено: BaltikS от Февраль 02, 2006, 12:26
sleep - не поможет?


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: Konstantin от Февраль 02, 2006, 21:04
Цитата: "Turing"
Кто-нить знает как реализовать паузу (задержку на n секунд) в программме написанной на Qt 4.1.0???


QTimer ?


Название: Пауза (задержка) на QT 4.1.0
Отправлено: Gop-Stop от Февраль 02, 2006, 21:38
в 3-е я делал так

QTime time;
time.start();
for(;time.elapsed() < 1000;)
{
 можно (qApp->processEvents();)
}

продолжение


Название: Пауза (задержка) на QT 4.1.0
Отправлено: Turing от Февраль 02, 2006, 22:05
Цитата: "Gop-Stop"
в 3-е я делал так

QTime time;
time.start();
for(;time.elapsed() < 1000;)
{
 можно (qApp->processEvents();)
}

продолжение


Это как раз я и искал  (под Qt 4 я уже подправил) :!:
Спасибо  :D


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: Vitto74 от Февраль 25, 2010, 20:38
Блин. На что ты заменил time.elapsed()?


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: pastor от Февраль 25, 2010, 20:57
Очень актуальный вопрос 4 года спустя


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: A-GENT от Ноябрь 17, 2010, 20:47
Ха, а для меня актуально  :o


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: erinyes от Март 01, 2011, 11:00
Собственно, сабж. Только Qt 4.6.
Есть поток, в котором создается объект класса, который интерпретирует команды. Одна из этих команд - пауза на n секунд. Я так понимаю, для потока wait() работает, если вызывается exec(), а я не вызываю. Может быть помог бы sleep(), но он protected.
Есть ли что-нибудь кроме метода с циклом (как-то он мне не нравится)? Ну то есть как лучше по правильному сделать? Например, можно создать мьютекс, заблокировать и в течении n секунд ждать разблокировки, но это криво  :) Может я как-то неправильно понял как с потоками работать и можно exec() использовать и wait(). Посоветуйте пожалуйста!


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: Пантер от Март 01, 2011, 11:14
Код
C++ (Qt)
void mySleep (uint msec)
{
#ifdef Q_WS_WIN
Sleep (msec);
#else //Q_WS_WIN
usleep (msec * 1000);
#endif //Q_WS_WIN
}
 


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: erinyes от Март 01, 2011, 11:47
Спасибо!


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: navrocky от Март 01, 2011, 12:27
Код
C++ (Qt)
#include <QThread>
 
class thread_hack : public QThread
{
public:
   using QThread::sleep;
   using QThread::msleep;
   using QThread::usleep;
};
 
...
 
// using
thread_hack::msleep(5000);
 


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: Пантер от Март 01, 2011, 13:28
А еще
Код
C++ (Qt)
#define private public
#include <QThread>
 
QThread::msleep(5000);
 

Не нужно пользоваться хаками.


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: navrocky от Март 01, 2011, 15:20
Код
C++ (Qt)
#define private public
#include <QThread>
 

Остроумно )

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

А у себя я зову sleep из буста...
Код
C++ (Qt)
#include <boost/thread/thread.hpp>
void sleep(int milliseconds)
{
   boost::this_thread::sleep(boost::posix_time::milliseconds(milliseconds));
}
 


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: Авварон от Март 01, 2011, 16:57
метод протектед тк его можно звать только из треды, создаваемой внутри qthread. иначе слипнется тред вызывающего, неужели неясно


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: navrocky от Март 01, 2011, 18:09
Цитировать
иначе слипнется тред вызывающего, неужели неясно

Именно это и нужно.

Хотя, конечно, ясно почему: тролли хотят чтобы все писали на кьют асинхронные аппликухи, поэтому просто нагнули. Но могли бы и предоставить публично методы sleep.


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: Akon от Март 01, 2011, 20:02
Тоже не поддерживаю закрытость sleep(). Вполне было бы типично
QThread::currentThread()::sleep(n);

Пабликом Морозовым вытягиваем sleep-ы, как показал navrocky, и получаем кроссплатформенную функцию.


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: Авварон от Март 01, 2011, 20:12
если вам надо паузить мейн тред, то у вас руки из ж. гуй у вас как работать будет?


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: erinyes от Март 01, 2011, 20:23
если вам надо паузить мейн тред, то у вас руки из ж. гуй у вас как работать будет?

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

И, кстати, я не совсем понял почему не работает QThread::сurrentThread()->wait(msec); Предположение я высказал про не вызов в потоке exec(), оно правильное? В документации я такого не видел вроде. Написано - либо выход из run() и true, либо таймаут и false. Про необходимость exec'а не сказано.


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: BRE от Март 01, 2011, 20:29
Может быть помог бы sleep(), но он protected.
Ну и что что он protected?
Ты наследуешь свой поток от QThread и можешь спокойно пользоваться protected-методами.
Т.е. внутри своих потоков - пользуйся sleep, внутри главного - нет. Ну это и правильно (кстати тему эту уже столько раз мусолили...)


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: erinyes от Март 01, 2011, 21:06
Ты наследуешь свой поток от QThread и можешь спокойно пользоваться protected-методами.
Т.е. внутри своих потоков - пользуйся sleep, внутри главного - нет. Ну это и правильно (кстати тему эту уже столько раз мусолили...)

У меня не совсем так. Внутри потока, создается объекта класса интерпретатор, который должен уметь делать паузу в выполнении кода. Он про потоки ничего вроде как не знает (ну или самый минимум).

В целом, меня полностью устроило решение Пантер'а.


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: Igors от Март 01, 2011, 21:10
Код
C++ (Qt)
#define private public
 
Во. и так можно! И это, значит, "не хак"? То есть по книжке одно (концептуальность, чистота рядов и.т.п.) - а по жизни совсем другое?  :)



Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: Пантер от Март 01, 2011, 22:00
Это грязный хак - нарушение инкапсуляции, которая есть основа ООП.


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: pastor от Март 01, 2011, 22:15
У меня не совсем так. Внутри потока, создается объекта класса интерпретатор, который должен уметь делать паузу в выполнении кода. Он про потоки ничего вроде как не знает (ну или самый минимум).

Ну пусть тогда интерпретатор даст знать потоку когда ему уснуть. Зачем городить всякого рода костыли типа

Цитировать
#define private public


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: Igors от Март 01, 2011, 22:32
Рано или поздно выяснится что нужна "нормальная синхронизация", а не "пауза" (затычка для отладки)


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: erinyes от Март 01, 2011, 22:47
...
Ну пусть тогда интерпретатор даст знать потоку когда ему уснуть. Зачем городить всякого рода костыли типа

Да, это вариант, но я не наследовал интерпретатор от QObject. Возможно, я не прав, но я посчитал, что это лишнее, так что сигналов и слотов мой класс не имеет.
Цитировать
#define private public
Я не делал и делать не собираюсь - это жестокий изврат. И лезть к protected методам не собираюсь. Меня вполне удовлетворило решение на API для двух операционок. Хотя я надеялся, что есть простой вариант с помощью Qt средств. Вероятно, можно и нужно лучше использовать поток, чем просто перегружать run().

Рано или поздно выяснится что нужна "нормальная синхронизация", а не "пауза" (затычка для отладки)
Igors, это не для синхронизации нужно - либо ты невнимательно читал, либо я плохо объясняю(понимаю). В любом случае, мне интересны предложения как лучше подобную вещь организовывать.


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: Igors от Март 01, 2011, 23:10
Igors, это не для синхронизации нужно - либо ты невнимательно читал, либо я плохо объясняю(понимаю). В любом случае, мне интересны предложения как лучше подобную вещь организовывать.
А нужна ли та вещь чтобы ее организовывать? Ладно, пусть скорость в Вашей задаче не нужна - можно прождать неск. секунд (вагон времени, хотя данные могут уже быть давно готовы). А что остальные нитки - тоже ждут или как? Это приемлемо если напр. какая-то нитка занята только высасыванием данных из сокета  (и то не всегда)


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: erinyes от Март 01, 2011, 23:45
... Ладно, пусть скорость в Вашей задаче не нужна - можно прождать неск. секунд (вагон времени, хотя данные могут уже быть давно готовы)....
Данные или синхронизация тут вообще не причем, просто нужна пауза до интерпретации следующего кода.


Название: Re: Пауза (задержка) на QT 4.1.0
Отправлено: Akon от Март 02, 2011, 09:38
Цитировать
И, кстати, я не совсем понял почему не работает QThread::сurrentThread()->wait(msec);

Данная функция предназначена для синхронизации, а не для задержки. Она вызывается из другого потока, а не из данного.

Когда поток заканчивает выполнение, т.е. происходит выход из run() (более точно - заканчивает выполнение системная функция потока), то освобождается соответствующий объект ядра операционной системы - на него и реагирует wait(). Как частный случай, если в потоке крутится цикл обработки сообщений, то он прерывается по exec() и далее происходит выход из run().