Russian Qt Forum

Qt => Общие вопросы => Тема начата: SABROG от Июль 29, 2009, 13:37



Название: static QEventLoop странное поведение
Отправлено: 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. В чем косяк?


Название: Re: static QEventLoop странное поведение
Отправлено: denka от Июль 29, 2009, 13:52
Может стоит поменять строчку
Код:
return new QEventLoop(qApp);

на

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

 :)


Название: Re: static QEventLoop странное поведение
Отправлено: BRE от Июль 29, 2009, 13:53
Есть такой код

Код
C++ (Qt)
   static QEventLoop * eventLoop()
   {
       if (loop) {
           return loop;
       } else {
           return new QEventLoop(qApp);
       }
   }
 
Внимательно посмотри, что будет возвращать eventLoop() после каждого вызова.


Название: Re: static QEventLoop странное поведение
Отправлено: BigZ от Июль 29, 2009, 13:54
А() {} --> A() : Base () {},  Base() : loop(0) { ... }


Название: Re: static QEventLoop странное поведение
Отправлено: BRE от Июль 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;
   }
 


Название: Re: static QEventLoop странное поведение
Отправлено: denka от Июль 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);
   }
 

Кто напишет меньше букав? :)


Название: Re: static QEventLoop странное поведение
Отправлено: SABROG от Июль 29, 2009, 14:02
den'ka, спасибо. Что-то я совсем не внимательный стал в последнее время.


Название: Re: static QEventLoop странное поведение
Отправлено: SABROG от Июль 29, 2009, 14:27
Base() : loop(0) { ... }

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

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

A() : Base () {}

В этом тоже смысла нет, конструктор Base() и без того вызывается.


Название: Re: static QEventLoop странное поведение
Отправлено: BigZ от Июль 29, 2009, 14:42
Base() : loop(0) { ... }

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

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

A() : Base () {}

В этом тоже смысла нет, конструктор Base() и без того вызывается.
Ах да, прошу прощения, не заметил что классовая переменная статическая и к тому-же
инициализируется шагом ниже.