crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

4 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
> остаток времени в QTime
AD
  опции профиля:
сообщение 11.6.2009, 17:56
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


В какой-то момент стартанули поток, процесс, таймер (не столь важно). Этот момент времени запомнили. Через какие-то промежутки времени берем текущее время. Узнаем разность. Но вопрос в том, как получить оставшееся время?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.6.2009, 18:03
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(AD @ 11.6.2009, 21:56) *
оставшееся время?
а что это такое?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 11.6.2009, 18:12
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


А ну да... :) не так выразился...
Задали какое-то время выполнения чего-то! Ну к примеру, 5 минут, или же 2 часа. Стартанули выполнение. Как узнать, сколько времени выполняться осталось? :)

Сообщение отредактировал AD - 11.6.2009, 18:13
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.6.2009, 18:47
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Запомнить время начала и посчитать сколько должно быть по завершении.
Затем периодически проверять сколько сейчас времени. Ну а как посчитать сколько осталось зная "Сечас" и "Конец" -это из школьной арифметики.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 11.6.2009, 21:48
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Litkevich Yuriy @ 11.6.2009, 19:47) *
Запомнить время начала и посчитать сколько должно быть по завершении.
Затем периодически проверять сколько сейчас времени. Ну а как посчитать сколько осталось зная "Сечас" и "Конец" -это из школьной арифметики.

Блин, чуточку сам не додумался. Спасибо, в понедельник сделаю! :)))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 15.6.2009, 12:33
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Не могу понять, как сделать, чтобы во время отсчета времени приложение не зависало, собственно для этого и было переведено в отдельный поток.

Вот код:
Thread
/// Класс потока - вращение вокруг осей заданное количество времени - длительное вращение
class ContinueRotation: public QThread
{
    Q_OBJECT

private:
    QTime _time;                                ///< счетчик времени вращения прожектора
    QTime starting_time, finished_time;            ///< время начала и окончания отсчета

private:
    void readAzimuth(int& geted_azimuth, double limit);
    void readAngleElevation(int& geted_angle_elev, double limit);

protected:
    virtual void run();

signals:
    void timeout(QTime);

public:
    ContinueRotation(QObject *parent);
    ~ContinueRotation();
    QTime elapsedTime() const { return _time; }
    QTime startingTime() const { return starting_time; }
    void setTime(const QTime& t) { _time = t; }
    void setTime(const int h, const int m) { _time.setHMS(h, m, 0, 0); }
    void setStartingTime(const QTime& t);
};


/// Установка времен начала и окончания работы прожектора
void ContinueRotation::setStartingTime(const QTime& t)
{
    starting_time = t;
    finished_time.setHMS(starting_time.hour() + _time.hour(), starting_time.minute() + _time.minute(),
                         starting_time.second() + _time.second(), starting_time.msec() + _time.msec());
}

/// Запуск потока вращения в обеих плоскостях длительный промежуток времени
void ContinueRotation::run()
{
    while(_time.hour() || _time.minute() || _time.second() || _time.msec())
    {
        int secs = QDateTime::currentDateTime().time().secsTo(finished_time);
        QTime t;    t = t.addSecs(secs);
        _time = t;
        emit timeout(_time);
    }
}


Main Thread
/// Класс отображения параметров работы в автоматическом режиме продолжительное время
class ContinuousWork: public QWidget, public ContinuousWorkClass
{
    Q_OBJECT

private:
    ContinueRotation* _continue;                ///< указатель на класс потока, выполняющий необходимое вращение

private slots:
    void changeHour(int h);                                    
    void startControl();
    void elapsedTime(QTime t) { editElapsedTime -> setTime(t); }           ///< editElapsedTime  - имеет тип QTimeEdit

public:
    ContinuousWork(QWidget *parent = 0);
    ~ContinuousWork();
};

ContinuousWork::ContinuousWork(QWidget *parent): QWidget(parent)
                                           _continue(new ContinueRotation(parent))
{
        // anybody

    connect(btnStartControl, SIGNAL(clicked()), this, SLOT(startControl()));
    connect(_continue, SIGNAL(timeout(QTime)), SLOT(elapsedTime(QTime)));
}

/// Запуск работы прожектора
void ContinuousWork::startControl()
{
    _continue -> setTime(spinHours -> value(), spinMinutes -> value());
    _continue -> setStartingTime(QDateTime::currentDateTime().time());
    _continue -> start();
}


Приложение зависает на время выполнение работы. Как это поправить можно?

Сообщение отредактировал AD - 15.6.2009, 12:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 15.6.2009, 12:59
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Поправь меня, если я не прав, но тут посылается целый шквал эвентов timeout() и я не вижу условий, чтобы он прекратился, скорее всего очередь сообщений переполняется и GUI просто не успевает их всех обработать.

void ContinueRotation::run()
{
    while(_time.hour() || _time.minute() || _time.second() || _time.msec())
    {
        int secs = QDateTime::currentDateTime().time().secsTo(finished_time);
        QTime t;    t = t.addSecs(secs);
        _time = t;
        emit timeout(_time);
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 15.6.2009, 13:16
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(SABROG @ 15.6.2009, 13:59) *
Поправь меня, если я не прав, но тут посылается целый шквал эвентов timeout() и я не вижу условий, чтобы он прекратился, скорее всего очередь сообщений переполняется и GUI просто не успевает их всех обработать.

Ну а как тогда лучше сделать? Ну как заставить его посылать эти эвенты раз в секунду?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 15.6.2009, 13:31
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(AD @ 15.6.2009, 14:16) *
Ну а как тогда лучше сделать? Ну как заставить его посылать эти эвенты раз в секунду?


Через QTimer созданный в run()? Ну или раз ты решил через diff делать, то проверяй, если прошло больше или равно 1000 мс, то посылать сигнал.

Сообщение отредактировал SABROG - 15.6.2009, 13:45
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 15.6.2009, 13:46
Сообщение #10


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(AD @ 15.6.2009, 14:16) *
Ну как заставить его посылать эти эвенты раз в секунду?

это точно так необходимо? без этого никак?
Цитата(Litkevich Yuriy @ 11.6.2009, 19:47) *
Запомнить время начала и посчитать сколько должно быть по завершении.
Затем периодически проверять сколько сейчас времени. Ну а как посчитать сколько осталось зная "Сечас" и "Конец" -это из школьной арифметики.

была такая проблемка и у меня.
если я правильно понял, то Запомнить время начала это запомнить системное время? так?
я сначала так и сделал, но потом от шефа получил по рукам.
шеф мотивировал тем что если время выполнения большое к примеру более 1 минуты то пользователь сможет поменять системное время и тогда будет ерунда.

наверное самому время надо считать в смысле заводить таймер и наращивать время.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V   1 2 3 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 21:02