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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: НЕ получается запустить однократно QTimer  (Прочитано 4978 раз)
ussed
Гость
« : Сентябрь 16, 2014, 21:54 »

OS Archlinux(64) QT5.3
Сообщениий об ошибках на стадии компиляции и выполнения не было,
но задача  выполняет бесконечный цикл while,т.е. не прекращает однократный запуск таймера.
Просьба помоч найти ошибку.
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>
#include <QTimer>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    int i;
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    bool flt,t1;
    QTimer *tm;
public slots:
    void mytms()
    {
        flt=false;
    }
};
#endif // MAINWINDOW_H
//====================
#include <QtWidgets>
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    tm=new QTimer();
    tm->setSingleShot(true);
    connect(tm,SIGNAL(timeout()),this,SLOT(mytms()));
    flt=true;
    qDebug()<<"aa";
    tm->start(15);
    t1=tm->isActive();
    while(flt)
    {
        t1=tm->isActive();
    }
    qDebug()<<"bb";
}

MainWindow::~MainWindow()
{

}
//=======================
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
//==============
QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = qtimer_tst
TEMPLATE = app
SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h
Записан
Bepec
Гость
« Ответ #1 : Сентябрь 16, 2014, 21:57 »

...


У тебя бесконечный цикл в конструкторе. Система сигнал слот не может запуститься из-за него. Потому нахрен убирай цикл из конструктора и будет тебе счастье.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Сентябрь 16, 2014, 22:01 »

и однократный таймер проще запускать через QTimer::singleshot()
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ussed
Гость
« Ответ #3 : Сентябрь 16, 2014, 22:19 »

1.как так? Ведь в  в слоте flt должен по окончании работы таймера принять значение false
2При трассеровке задачи "isActive" показывает что таймер активен.
Записан
Bepec
Гость
« Ответ #4 : Сентябрь 16, 2014, 22:23 »

Мде... Сказали убрать цикл - уберите цикл и посмотрите. Мб поймете.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #5 : Сентябрь 16, 2014, 22:30 »

1.как так?

события таймера работают в том же потоке, что и код MainWindow. Бесконечный while блокирует поток и таймер никогда не пошлёт сигнал.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Сентябрь 17, 2014, 09:33 »

Мде... Сказали убрать цикл - уберите цикл и посмотрите. Мб поймете.
Для иронии нет оснований. Человек рассчитывал что таймер работает "извне" (в др потоке) и изменит значение переменной асинхронно. Но, как уже сказали, это не так.
Записан
Bepec
Гость
« Ответ #7 : Сентябрь 17, 2014, 09:36 »

Тут не ирония, а желание обучаться замешаны.

Можно ж почитать сначала про сигнал-слоты, попробовать с циклом и без. Плюнуть на самодеятельность и скопировать код из ассистента.
Записан
ussed
Гость
« Ответ #8 : Сентябрь 17, 2014, 11:23 »

Представленый код, проверка возможности управляемой задержки между участком аа и вв
.Закоменировал while ,при трассировки в отладчике flt and t1 остаются true
.Можно конечно вставить несколько циклов, но хотелось сделать средствами qt.
Спасибо за внимание.
Записан
Bepec
Гость
« Ответ #9 : Сентябрь 17, 2014, 11:30 »

У вас неверное понимание работы сигнал слотов в общем. Так же нет понимания как работают потоки. Если хотите - сформулируйте вопрос и я вам на него отвечу.
А чтобы замерить время между аа и бб таймер не подойдёт. Вам подойдёт QTime::elapsed()
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Сентябрь 17, 2014, 11:42 »

Представленый код, проверка возможности управляемой задержки между участком аа и вв
.Закоменировал while ,при трассировки в отладчике flt and t1 остаются true
Когда приложение выйдет в цикл ожидания событий - вот тогда оно получит событие таймера и сработает слот. А до этого Ваш код будет выполняться, никакие события еще не будут получены. Можно самому напроситься на получение событий вставив в цикл qApp->processEvents(), но осторожно - надо считаться что могут прийти и др события (не только таймер)
Записан
ussed
Гость
« Ответ #11 : Сентябрь 17, 2014, 11:47 »

Спасибо нашел, есть функции delay and qwait.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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