Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Bhted от Январь 27, 2015, 15:15



Название: QTimer и поток [решено]
Отправлено: Bhted от Январь 27, 2015, 15:15
Есть такой код:
Код:
class Indicator : public  QObject
{
    Q_OBJECT

public:
    Indicator();
    void start();
    void init();

private:
    QTimer dataTimer;

private slots:
    void onDraw();
};

Код:
Indicator::Indicator()
{
}

void Indicator::onDraw()
{
    std::cout << "input to onDraw" << std::flush;
    doSomething();
    std::cout << "out from onDraw" << std::flush;
}

void Indicator::start()
{
    std::cout << "input to setValue" << std::flush;
    dataTimer.start(100);
    std::cout << "out from setValue" << std::flush;
}

void Indicator::init(QCustomPlot *customPlot)
{
    connect(&dataTimer, SIGNAL(timeout()), this, SLOT(onDraw()));
}

В главном окне приложения есть такое:
Код:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    indicator.init();
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(onStart()));
}

void MainWindow::onStart()
{
    indicator.start();

}

Если во время работы Indicator::onDraw() (где-то внутри doSomething()) нажать кнопку pushButton, то у нас вызовется слот onStart()? И если да, то таймер перезапустится?
И если эти предположения верны, то как избежать этого?


Название: Re: QTimer и поток
Отправлено: gil9red от Январь 27, 2015, 16:32
Вам не нужно перезапускать его, если он запущен?

проверяйте, тогда, метод isActive() (http://qt-project.org/doc/qt-4.8/qtimer.html#active-prop)


Название: Re: QTimer и поток
Отправлено: Bhted от Январь 27, 2015, 16:48
Я хочу чтобы было так: если во время работы таймера где-то внутри doSomething() произойдёт событие и будет вызвана функция Indicator::start(), то выполнение кода этой функции было бы отложено до тех пор, пока мы не выйдем из Indicator::onDraw(). В общем, что-то вроде критической секции, которую вроде можно было бы применить, но таймер же не создаёт отдельного потока для onDraw().


Название: Re: QTimer и поток
Отправлено: Igors от Январь 28, 2015, 08:13
Если во время работы Indicator::onDraw() (где-то внутри doSomething()) нажать кнопку pushButton, то у нас вызовется слот onStart()? И если да, то таймер перезапустится?
И если эти предположения верны, то как избежать этого?
Тут нечего избегать. onDraw завершится, приложение выйдет в цикл событий и извлечет нажатие на pushButton - только тогда вызовется onStart. Проблема только если Вы сами (по своей инициативе) хотите получать события в теле onDraw вызывая qApp->processEvents, но Вы же этого не делаете


Название: Re: QTimer и поток
Отправлено: Bhted от Январь 28, 2015, 09:52
Цитировать
Проблема только если Вы сами (по своей инициативе) хотите получать события в теле onDraw вызывая qApp->processEvents
О, я так и подумал, когда вызывал processEvents. Спасибо!