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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QObject::killTimer: Timers cannot be stopped from another thread  (Прочитано 7989 раз)
nvek
Гость
« : Август 18, 2017, 11:14 »

Консоль выводит следующие предупреждения:

QObject::killTimer: Timers cannot be stopped from another thread
QObject::~QObject: Timers cannot be stopped from another thread

Класс таймер:
Код:
#include "Timer.h"

Timer::Timer()
{

}

Timer::~Timer()
{
delete timer;
//quit();
}

void Timer::run()
{
timer = new QTimer();
//timer->moveToThread(this);

connect(timer, SIGNAL(timeout()), SLOT(sl_OnTimer()), Qt::DirectConnection);

timer->start(1000);

exec();
}

void Timer::sl_OnTimer()
{
emit sg_TimOut();
}

void Timer::sl_SetInterval1(bool)
{
timer->setInterval(1000);
if (!timer->isActive())
timer->start();
}




void Timer::sl_StopTimer(bool)
{
timer->stop();
}

На главной форме:
Код:
MainForm::MainForm():
{
        //...
m_tmr = new Timer(); //класс поток для таймера
m_tmr->start();
connect(m_tmr, &Timer::sg_TimOut, this, &MainForm::updateByTimer, Qt::QueuedConnection);

Код:
MainForm::~MainForm()
{
//delete m_tmr;
m_tmr->quit();
delete m_tmr;
Записан
nvek
Гость
« Ответ #1 : Август 18, 2017, 11:42 »

и еще, надо таймеру изменить интервал
Код:
autoUpd1Act = new QAction(Resource::OPTIONS_AUTOUPDATE1, this);
autoUpd1Act->setCheckable(true);
autoUpd1Act->setStatusTip(Resource::STATUS_OPTIONS_AUTOUPDATE1);
connect(autoUpd1Act, &QAction::triggered, m_tmr, &Timer::sl_SetInterval1, Qt::DirectConnection);
падает на коннекте. Необработанное исключение ...
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #2 : Август 18, 2017, 12:09 »

Исправления на вскидку

Класс таймер:
Код
C++ (Qt)
#include "Timer.h"
 
Timer::Timer( int interval )
: m_interval( interval )
, m_start_flag()
{
 
}
 
Timer::~Timer()
{
}
 
void Timer::run()
{
QTimer timer;
connect(&timer, SIGNAL(timeout()), this, SIGNAL(sg_TimOut()));
connect( this, SIGNAL(timerStarted(int)), &timer, SLOT(start(int)));
connect( this, SIGNAL(timerStoped()), &timer, SLOT(stop()));
if ( m_start_flag )
timer.start( m_interval );
exec();
}
 
void Timer::start( int interval )
{
m_interval = interval;
m_start_flag = true;
emit timerStarted( interval );
}
 
void Timer::stop()
{
m_start_flag = false;
emit timerStoped();
}
 

На главной форме:
Код
C++ (Qt)
MainForm::MainForm():
{
       //...
m_tmr = new Timer(); //класс поток для таймера
m_tmr->start();
connect(m_tmr, &Timer::sg_TimOut, this, &MainForm::updateByTimer );
 
 
Код
C++ (Qt)
MainForm::~MainForm()
{
//delete m_tmr;
m_tmr->quit();
delete m_tmr;
 

Нельзя напрямую вызывать методы экземпляра timer внутри класса Timer, так как this и timer связаны с разными потоками.
« Последнее редактирование: Август 18, 2017, 12:13 от ssoft » Записан
nvek
Гость
« Ответ #3 : Август 22, 2017, 06:03 »

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

на этом коннекте падает вылетает:
connect(autoUpd1Act, &QAction::triggered, m_tmr, [&](bool) { m_tmr->startTimer(1000); });
Записан
nvek
Гость
« Ответ #4 : Август 22, 2017, 06:06 »

и по завершению программы выводит следующее:
QObject::connect: No such slot QTimer::startTimer(int) in ...
где startTimer(int) переименованный start(int)
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #5 : Август 30, 2017, 09:32 »

и по завершению программы выводит следующее:
QObject::connect: No such slot QTimer::startTimer(int) in ...
где startTimer(int) переименованный start(int)

Здесь не зарегистрирован слот с помощью Q_SLOT, а также, скорее всего, не декларирован макрос Q_OBJECT внутри определения типа Timer.

Код
C++ (Qt)
class Timer : public QThread
{
   Q_OBJECT
...
   Q_SLOT void startTimer ( int interval );
...
};
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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