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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Применение таймера в потоке  (Прочитано 4039 раз)
pethead
Гость
« : Ноябрь 18, 2010, 05:24 »

насколько я понял таймер должен запускаться в теле run (иначе ругается cannot run from another tyread), но без exec в теле run событие timeout не словится. какой смысл тогда в таймере в потоке? как применять таймер в потоке?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Ноябрь 18, 2010, 08:05 »

Цитировать
MyThread::run
{
    QTimer timer;
    connect(&timer, SIGNAL(timeout()), this, SLOT(procTimer()));
    exec();
}

MyThread::procTimer()
{
    //proc
}
Записан

ArchLinux x86_64 / Win10 64 bit
pethead
Гость
« Ответ #2 : Ноябрь 18, 2010, 12:37 »

ну это разово, а если надо перезапустить таймер. убивать поток и снова запускать?
а если мне в run надо запускать таймер, ждать когда сработает, и дальше продолжать.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Ноябрь 18, 2010, 13:22 »

Цитировать
ну это разово, а если надо перезапустить таймер. убивать поток и снова запускать?
Код:
class MyTimer : public QTimer
{
public slots:
    void restart() { this->stop; this->start();}
}

class MyThread: public QThread
{
signals:
    void signalRestart();

protected:
    void run() {
        MyTimer timer;
        connect(&timer, SIGNAL(timeout()), this, SLOT(procTimer()));
        connect(this, SIGNAL(signalRestart()), &timer, SLOT(restart()));
        exec();
    }

public:
    void procTimer() { //proc }
    
    void restartTimer() { emit signalRestart(); }
};
« Последнее редактирование: Ноябрь 18, 2010, 13:24 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
pethead
Гость
« Ответ #4 : Ноябрь 18, 2010, 14:18 »

ну т.е. это получается таймер в отдельном потоке и все. включай его выключай и получай событие.
мне надо чтобы в потоке крутилась задача в бесконечном цикле, и там применялся бы таймер для ожидания чего либо. выходит задачу надо крутить в отдельном потоке, а таймер в другом.
Записан
alexman
Гость
« Ответ #5 : Ноябрь 18, 2010, 15:07 »

А зачем таймер? Например, можно завести переменную обозначающую текущее состояние, прикрыть её мьютексом, а в цикле (в run) проверять значение этой переменной.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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