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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTimer и поток [решено]  (Прочитано 2542 раз)
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()? И если да, то таймер перезапустится?
И если эти предположения верны, то как избежать этого?
« Последнее редактирование: Январь 28, 2015, 09:53 от Bhted » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Январь 27, 2015, 16:32 »

Вам не нужно перезапускать его, если он запущен?

проверяйте, тогда, метод isActive()
Записан

Bhted
Гость
« Ответ #2 : Январь 27, 2015, 16:48 »

Я хочу чтобы было так: если во время работы таймера где-то внутри doSomething() произойдёт событие и будет вызвана функция Indicator::start(), то выполнение кода этой функции было бы отложено до тех пор, пока мы не выйдем из Indicator::onDraw(). В общем, что-то вроде критической секции, которую вроде можно было бы применить, но таймер же не создаёт отдельного потока для onDraw().
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Январь 28, 2015, 08:13 »

Если во время работы Indicator::onDraw() (где-то внутри doSomething()) нажать кнопку pushButton, то у нас вызовется слот onStart()? И если да, то таймер перезапустится?
И если эти предположения верны, то как избежать этого?
Тут нечего избегать. onDraw завершится, приложение выйдет в цикл событий и извлечет нажатие на pushButton - только тогда вызовется onStart. Проблема только если Вы сами (по своей инициативе) хотите получать события в теле onDraw вызывая qApp->processEvents, но Вы же этого не делаете
Записан
Bhted
Гость
« Ответ #4 : Январь 28, 2015, 09:52 »

Цитировать
Проблема только если Вы сами (по своей инициативе) хотите получать события в теле onDraw вызывая qApp->processEvents
О, я так и подумал, когда вызывал processEvents. Спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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