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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QTimer и потоки  (Прочитано 14393 раз)
Edynchik
Гость
« : Ноябрь 10, 2011, 12:40 »

Я понимаю, что тема поднималась миллион раз, но все таки скажите в чем ошибка?
Код
C
#include <QtGui/QApplication>
#include "mainwindow.h"
#include "thread.h"
#include <QTimer>
 
//bool func();
bool b;
//QTimer t;
 
void MyThread::run()
{
   QTimer t;
   //t = new QTimer(this);
   connect(&t,SIGNAL(timeout()),this,SLOT(func()));
   //t.start(10);
   exec();
}
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   MainWindow w;
   MyThread thread;
   thread.start();
           if(thread.func() == true)
           int i=0;
   w.show();
   return a.exec();
}
bool MyThread::func()
{
   bool b=true;
   return b;
}

Код
C
#ifndef THREAD_H
#define THREAD_H
#include <QThread>
 
class MyThread : public QThread
{
public:
    void run();
public slots:
    bool func();
};
 
#endif // THREAD_H
Почему по таймеру не вызывается функция func()?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Ноябрь 10, 2011, 12:45 »

потому что таймер - локальная переменная?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Edynchik
Гость
« Ответ #2 : Ноябрь 10, 2011, 13:21 »

а тогда почему b не равно true, в таком случае:
Код
C
#include <QtGui/QApplication>
#include "mainwindow.h"
#include "thread.h"
#include <QTimer>
 
//bool func();
bool b;
QTimer t;
 
void MyThread::run()
{
   //QTimer t;
   //t = new QTimer(this);
   connect(&t,SIGNAL(timeout()),this,SLOT(func()));
   t.start(10);
   exec();
}
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   MainWindow w;
   MyThread thread;
   thread.start();
   if(b == true)
       int i=0;
   w.show();
   return a.exec();
}
bool MyThread::func()
{
   bool b=true;
   return b;
}
Записан
ddrtn
Гость
« Ответ #3 : Ноябрь 10, 2011, 13:28 »

Попробуйте так.
Код:
connect(&t,SIGNAL(timeout()),this,SLOT(func()), Qt::QueuedConnection);
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #4 : Ноябрь 10, 2011, 13:31 »

а тогда почему b не равно true, в таком случае
Где вы проверяете?
К
Код:
if(b == true)
        int i=0;
func() просто может не успеть выполниться.
Ну и b для уверенности лучше инициализировать явно false'ом.
Записан
twp
Гость
« Ответ #5 : Ноябрь 10, 2011, 13:34 »

Попробуйте так.
Код:
connect(&t,SIGNAL(timeout()),this,SLOT(func()), Qt::QueuedConnection);
у ТС используется соединение по умолчанию что избавляет от необходимости явно задавать тип соединения. Конечно же func() вызывается до старта потока
Записан
Edynchik
Гость
« Ответ #6 : Ноябрь 10, 2011, 14:57 »

у ТС используется соединение по умолчанию что избавляет от необходимости явно задавать тип соединения. Конечно же func() вызывается до старта потока
То есть как,раньше потока??
Записан
twp
Гость
« Ответ #7 : Ноябрь 10, 2011, 15:54 »

вызов thread.start(); запускает поток, и потом выполняется его метод run() который выполняется параллельно с основным потоком. И естественно на это уйдет немного времени. Основной поток после вызова thread.start(); сразу же переходит к следующему коду т.е. if(thread.func() == true)
А что собственно нужно сделать?
Записан
Edynchik
Гость
« Ответ #8 : Ноябрь 10, 2011, 16:11 »

нужно чтобы с интервалом выполнялась функция func, параллельно с основным потоком.
Код
C
#include <QtGui/QApplication>
#include "mainwindow.h"
#include "thread.h"
#include <QTimer>
 
 
bool b = false;
QTimer t;
 
void MyThread::run()
{
 
   connect(&t,SIGNAL(timeout()),this,SLOT(func()));
   t.start(100);
   //func();
   exec();
}
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   MainWindow w;
 
   MyThread thread;
   thread.start();
   for(int i =0;i<1000000;i++)
   {
   int x = i*i*i*i*i*i;
   if(b == true)
       i=0;
   }
   w.show();
   return a.exec();
}
bool MyThread::func()
{
   b = true;
   return b;
}

получается что b не становится true, т.е. в функцию func не заходит...
Записан
twp
Гость
« Ответ #9 : Ноябрь 10, 2011, 16:19 »

заходит, просто цикл выполняется быстрее чем за 100 мс  Улыбающийся а какой сакральный сысл во всем этом? Задежать на 100 мс w.show() правильно?
Записан
Edynchik
Гость
« Ответ #10 : Ноябрь 10, 2011, 16:22 »

заходит, просто цикл выполняется быстрее чем за 100 мс  Улыбающийся а какой сакральный сысл во всем этом? Задежать на 100 мс w.show() правильно?
нет,просто тренируюсь с потоками и таймером...понять как механизм вообще работает...
и кстати, если поставить точку останова w.show(), b не становится true...
« Последнее редактирование: Ноябрь 10, 2011, 16:24 от Edynchik » Записан
twp
Гость
« Ответ #11 : Ноябрь 10, 2011, 16:46 »

может и действительно не вызывается, может есть проблемы при коннекте сигнала со слотом, в логе ничего такого нет?
Записан
Edynchik
Гость
« Ответ #12 : Ноябрь 10, 2011, 16:49 »

скорее всего, потому что если run явно вызвать func, то все ок....вопрос в том, как это исправить...
Записан
twp
Гость
« Ответ #13 : Ноябрь 10, 2011, 16:51 »

забыл Q_OBJECT в thread.h
Записан
Edynchik
Гость
« Ответ #14 : Ноябрь 11, 2011, 09:55 »

забыл Q_OBJECT в thread.h
возникли следующие ошибки:
Код:
debug/main.o: In function `MyThread':
F:\QT\thread-build-desktop/../thread//thread.h:6: undefined reference to `vtable for MyThread'
debug/main.o: In function `~MyThread':
F:\QT\thread-build-desktop/../thread//thread.h:6: undefined reference to `vtable for MyThread'
collect2: ld returned 1 exit status
« Последнее редактирование: Ноябрь 11, 2011, 09:57 от Edynchik » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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