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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: static QEventLoop странное поведение  (Прочитано 5522 раз)
SABROG
Гость
« : Июль 29, 2009, 13:37 »

Есть такой код

Код
C++ (Qt)
#include <QtCore/QCoreApplication>
#include <QtCore/QtGlobal>
#include <QtCore/QtDebug>
#include <QtCore/QEventLoop>
#include <QtCore/QTimer>
 
#define USE_LOOP2 0
 
#if USE_LOOP2 == 1
static QEventLoop *loop2=0;
#endif
 
class Base
{
public:
   Base()
   {
#if USE_LOOP2 == 1
       loop2 = new QEventLoop;
#endif
   };
   virtual void foo() = 0;
   static QEventLoop * eventLoop()
   {
#if USE_LOOP2 == 1
       return loop2;
#else
       if (loop) {
           return loop;
       } else {
           return new QEventLoop(qApp);
       }
#endif
   }
   virtual ~Base(){};
private:
#if USE_LOOP2 != 1
   static QEventLoop *loop;
#endif
};
 
#if USE_LOOP2 != 1
QEventLoop *Base::loop=0;
#endif
 
class A : public Base
{
public:
   A(){}
   virtual ~A(){}
   void foo()
   {
       qDebug() << "Run exec...";
       qDebug() << eventLoop()->exec();
       qDebug() << "Exit exec...";
   }
};
 
int main(int argc, char *argv[])
{
   QCoreApplication app(argc, argv);
   A a;
   QTimer::singleShot(6000, a.eventLoop(), SLOT(quit()));
   a.foo();
   QTimer::singleShot(6000, &app, SLOT(quit()));
   return app.exec();
}
 
 

Если я использую статический указатель loop как член Base класса, то метод foo() никогда не возвращает управления и не реагирует на истекший таймер. Если я использую глобальный статический указатель loop2, то всё работает нормально. Для эксперимента можете менять дефайн USE_LOOP2=0/1. В чем косяк?
Записан
denka
Гость
« Ответ #1 : Июль 29, 2009, 13:52 »

Может стоит поменять строчку
Код:
return new QEventLoop(qApp);

на

Код:
return loop = new QEventLoop(qApp);

 Улыбающийся
Записан
BRE
Гость
« Ответ #2 : Июль 29, 2009, 13:53 »

Есть такой код

Код
C++ (Qt)
   static QEventLoop * eventLoop()
   {
       if (loop) {
           return loop;
       } else {
           return new QEventLoop(qApp);
       }
   }
 
Внимательно посмотри, что будет возвращать eventLoop() после каждого вызова.
Записан
BigZ
Гость
« Ответ #3 : Июль 29, 2009, 13:54 »

А() {} --> A() : Base () {},  Base() : loop(0) { ... }
« Последнее редактирование: Июль 29, 2009, 14:01 от BigZ » Записан
BRE
Гость
« Ответ #4 : Июль 29, 2009, 13:55 »

Может стоит поменять строчку
Код:
return new QEventLoop(qApp);

на

Код:
return loop = new QEventLoop(qApp);

 Улыбающийся
Код
C++ (Qt)
   static QEventLoop * eventLoop()
   {
       if (!loop)
           loop = new QEventLoop(qApp);
 
       return loop;
   }
 
Записан
denka
Гость
« Ответ #5 : Июль 29, 2009, 13:57 »

Может стоит поменять строчку
Код:
return new QEventLoop(qApp);

на

Код:
return loop = new QEventLoop(qApp);

 Улыбающийся
Код
C++ (Qt)
   static QEventLoop * eventLoop()
   {
       if (!loop)
           loop = new QEventLoop(qApp);
 
       return loop;
   }
 


Код
C++ (Qt)
   static QEventLoop * eventLoop()
   {
       return loop ? loop : loop = new QEventLoop(qApp);
   }
 

Кто напишет меньше букав? Улыбающийся
Записан
SABROG
Гость
« Ответ #6 : Июль 29, 2009, 14:02 »

den'ka, спасибо. Что-то я совсем не внимательный стал в последнее время.
Записан
SABROG
Гость
« Ответ #7 : Июль 29, 2009, 14:27 »

Base() : loop(0) { ... }

Так будет утечка памяти, к тому же я явно нулем уже все проинициализировал:

Код
C++ (Qt)
QEventLoop *Base::loop=0;
 

A() : Base () {}

В этом тоже смысла нет, конструктор Base() и без того вызывается.
Записан
BigZ
Гость
« Ответ #8 : Июль 29, 2009, 14:42 »

Base() : loop(0) { ... }

Так будет утечка памяти, к тому же я явно нулем уже все проинициализировал:

Код
C++ (Qt)
QEventLoop *Base::loop=0;
 

A() : Base () {}

В этом тоже смысла нет, конструктор Base() и без того вызывается.
Ах да, прошу прощения, не заметил что классовая переменная статическая и к тому-же
инициализируется шагом ниже.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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