Russian Qt Forum

Qt => Вопросы новичков => Тема начата: ussed от Сентябрь 16, 2014, 21:54



Название: НЕ получается запустить однократно QTimer
Отправлено: 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


Название: Re: НЕ получается запустить однократно QTimer
Отправлено: Bepec от Сентябрь 16, 2014, 21:57
...


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


Название: Re: НЕ получается запустить однократно QTimer
Отправлено: kambala от Сентябрь 16, 2014, 22:01
и однократный таймер проще запускать через QTimer::singleshot()


Название: Re: НЕ получается запустить однократно QTimer
Отправлено: ussed от Сентябрь 16, 2014, 22:19
1.как так? Ведь в  в слоте flt должен по окончании работы таймера принять значение false
2При трассеровке задачи "isActive" показывает что таймер активен.


Название: Re: НЕ получается запустить однократно QTimer
Отправлено: Bepec от Сентябрь 16, 2014, 22:23
Мде... Сказали убрать цикл - уберите цикл и посмотрите. Мб поймете.


Название: Re: НЕ получается запустить однократно QTimer
Отправлено: Alex Custov от Сентябрь 16, 2014, 22:30
1.как так?

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


Название: Re: НЕ получается запустить однократно QTimer
Отправлено: Igors от Сентябрь 17, 2014, 09:33
Мде... Сказали убрать цикл - уберите цикл и посмотрите. Мб поймете.
Для иронии нет оснований. Человек рассчитывал что таймер работает "извне" (в др потоке) и изменит значение переменной асинхронно. Но, как уже сказали, это не так.


Название: Re: НЕ получается запустить однократно QTimer
Отправлено: Bepec от Сентябрь 17, 2014, 09:36
Тут не ирония, а желание обучаться замешаны.

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


Название: Re: НЕ получается запустить однократно QTimer
Отправлено: ussed от Сентябрь 17, 2014, 11:23
Представленый код, проверка возможности управляемой задержки между участком аа и вв
.Закоменировал while ,при трассировки в отладчике flt and t1 остаются true
.Можно конечно вставить несколько циклов, но хотелось сделать средствами qt.
Спасибо за внимание.


Название: Re: НЕ получается запустить однократно QTimer
Отправлено: Bepec от Сентябрь 17, 2014, 11:30
У вас неверное понимание работы сигнал слотов в общем. Так же нет понимания как работают потоки. Если хотите - сформулируйте вопрос и я вам на него отвечу.
А чтобы замерить время между аа и бб таймер не подойдёт. Вам подойдёт QTime::elapsed()


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


Название: Re: НЕ получается запустить однократно QTimer
Отправлено: ussed от Сентябрь 17, 2014, 11:47
Спасибо нашел, есть функции delay and qwait.