LINUX.ORG.RU

[Qt]Почему эмисия унаследованных сигналов может вызывать безконечную рекурсию?

 


0

0

вобщем есть клас в котором обьявлено 5 сигналов. Есть непосредсвенный потомок класа который пытается делать емисию унаследованных сигналов но получает безконечную рекурсию.

В чём может быть проблема

★★★★★
Ответ на: комментарий от cvv

Родительский класс:

#ifndef SIM300_DBUS_ADAPTOR_H_1194960941                                                                                                     
#define SIM300_DBUS_ADAPTOR_H_1194960941                                                                                                     
                                                                                                                                             
#include <QtCore/QObject>                                                                                                                    
#include <QtDBus/QtDBus>                                                                                                                     
class QByteArray;                                                                                                                            
template<class T> class QList;                                                                                                               
template<class Key, class Value> class QMap;                                                                                                 
class QString;                                                                                                                               
class QStringList;                                                                                                                           
class QVariant;                                                                                                                              
                                                                                                                                             
/*                                                                                                                                           
 * Adaptor class for interface com.i_zum.sim300                                                                                              
 */                                                                                                                                          
class Sim300Adaptor: public QDBusAbstractAdaptor                                                                                             
{                                                                                                                                            
    Q_OBJECT                                                                                                                                 
    Q_CLASSINFO("D-Bus Interface", "com.i_zum.sim300")                                                                                       
    Q_CLASSINFO("D-Bus Introspection", "")                                                                                                                                  
public:                                                                                                                                      
    Sim300Adaptor(Sim300Adaptor *parent);                                                                                                    
    virtual ~Sim300Adaptor();                                                                                                                
                                                                                                                                             
    inline Sim300Adaptor *parent() const                                                                                                     
    { return static_cast<Sim300Adaptor *>(QObject::parent()); }                                                                              
                                                                                                                                             
public: // PROPERTIES                                                                                                                        
public Q_SLOTS: // METHODS                                                                                                                   
Q_SIGNALS: // SIGNALS                                                                                                                        
    virtual void csq(uint rssi, uint ber);                                                                                                   
    virtual void csq_error(const QString &err_msg);                                                                                          
    virtual void money(const QString &money);                                                                                                
    virtual void money_error(const QString &err_msg);                                                                                        
    virtual void opers_list(const QStringList &opers_list);                                                                                  
};                                                                                                                                           
                                                                                                                                             
#endif                                                                                                                                       

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

Потомок:

class MainClass : public Sim300Adaptor
{
    Q_OBJECT
public:
    MainClass(const QDBusConnection & _connection_);
    virtual ~MainClass();

    QDBusConnection connection;

signals:
private slots:
    void countersSlot(const QByteArray &byte_arr);
    void get_money_atd ();
    void get_money_cusd();
    void get_csq();

    void get_opers_list();
    void set_oper(const QString &oper);
public slots:
private:
    unsigned oper_idx;
};

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

ну, а коннекшены ?

Проверь тщательно слоты. Может, идут вызовы сигнал1->слот1->сигнал2->слот2->сигнал1. Вот и получается бесконечная рекурсия.

alex_custov ★★★★★
()
Ответ на: комментарий от cvv

реализация:

MainClass::MainClass(const QDBusConnection & _connection_)
:   Sim300Adaptor(this), connection(_connection_)
{
    oper_idx = 0xffffffff;
    connection.registerObject("/", this);
}

void MainClass::get_csq()
{
    unsigned char _rssi, _ber;
//...
    emit csq(_rssi, _ber);
}

ну вобщем последний emit и попадает в бесконечную рекурсию

cvv ★★★★★
() автор топика
Ответ на: комментарий от alex_custov

Да.

пытался посмотреть бектрейс в gdb но я там ничего не разобрал кроме того что исполнялся не мой код а код из moc_*.cpp файлов

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

#0  0xb7e1490c in QMetaObject::activate () from /usr/lib/qt-4.2.2/lib/libQtCore.so.4
#1  0xb7e159e1 in QMetaObject::activate () from /usr/lib/qt-4.2.2/lib/libQtCore.so.4
#2  0x0804df2f in Sim300Adaptor::csq_error (this=0xbf935fc4, _t1=@0xbf935a88) at moc_sim300_dbus_adaptor.cpp:112
#3  0x0804e033 in Sim300Adaptor::qt_metacall (this=0xbf935fc4, _c=QMetaObject::InvokeMetaMethod, _id=1, _a=0xbf13971c)
    at moc_sim300_dbus_adaptor.cpp:91
#4  0x0804dcc7 in MainClass::qt_metacall (this=0xbf935fc4, _c=QMetaObject::InvokeMetaMethod, _id=5, _a=0xbf13971c) at moc_sim300_dbus.cpp:67
#5  0xb7e14f1a in QMetaObject::activate () from /usr/lib/qt-4.2.2/lib/libQtCore.so.4
#6  0xb7e159e1 in QMetaObject::activate () from /usr/lib/qt-4.2.2/lib/libQtCore.so.4
#7  0x0804df2f in Sim300Adaptor::csq_error (this=0xbf935fc4, _t1=@0xbf935a88) at moc_sim300_dbus_adaptor.cpp:112
#8  0x0804e033 in Sim300Adaptor::qt_metacall (this=0xbf935fc4, _c=QMetaObject::InvokeMetaMethod, _id=1, _a=0xbf139c4c)
    at moc_sim300_dbus_adaptor.cpp:91
#9  0x0804dcc7 in MainClass::qt_metacall (this=0xbf935fc4, _c=QMetaObject::InvokeMetaMethod, _id=5, _a=0xbf139c4c) at moc_sim300_dbus.cpp:67
#10 0xb7e14f1a in QMetaObject::activate () from /usr/lib/qt-4.2.2/lib/libQtCore.so.4
#11 0xb7e159e1 in QMetaObject::activate () from /usr/lib/qt-4.2.2/lib/libQtCore.so.4
#12 0x0804df2f in Sim300Adaptor::csq_error (this=0xbf935fc4, _t1=@0xbf935a88) at moc_sim300_dbus_adaptor.cpp:112
#13 0x0804e033 in Sim300Adaptor::qt_metacall (this=0xbf935fc4, _c=QMetaObject::InvokeMetaMethod, _id=1, _a=0xbf13a17c)
    at moc_sim300_dbus_adaptor.cpp:91
#14 0x0804dcc7 in MainClass::qt_metacall (this=0xbf935fc4, _c=QMetaObject::InvokeMetaMethod, _id=5, _a=0xbf13a17c) at moc_sim300_dbus.cpp:67
#15 0xb7e14f1a in QMetaObject::activate () from /usr/lib/qt-4.2.2/lib/libQtCore.so.4
#16 0xb7e159e1 in QMetaObject::activate () from /usr/lib/qt-4.2.2/lib/libQtCore.so.4
#17 0x0804df2f in Sim300Adaptor::csq_error (this=0xbf935fc4, _t1=@0xbf935a88) at moc_sim300_dbus_adaptor.cpp:112
#18 0x0804e033 in Sim300Adaptor::qt_metacall (this=0xbf935fc4, _c=QMetaObject::InvokeMetaMethod, _id=1, _a=0xbf13a6ac)
    at moc_sim300_dbus_adaptor.cpp:91
#19 0x0804dcc7 in MainClass::qt_metacall (this=0xbf935fc4, _c=QMetaObject::InvokeMetaMethod, _id=5, _a=0xbf13a6ac) at moc_sim300_dbus.cpp:67
#20 0xb7e14f1a in QMetaObject::activate () from /usr/lib/qt-4.2.2/lib/libQtCore.so.4
#21 0xb7e159e1 in QMetaObject::activate () from /usr/lib/qt-4.2.2/lib/libQtCore.so.4
#22 0x0804df2f in Sim300Adaptor::csq_error (this=0xbf935fc4, _t1=@0xbf935a88) at moc_sim300_dbus_adaptor.cpp:112
#23 0x0804e033 in Sim300Adaptor::qt_metacall (this=0xbf935fc4, _c=QMetaObject::InvokeMetaMethod, _id=1, _a=0xbf13abdc)
    at moc_sim300_dbus_adaptor.cpp:91
#24 0x0804dcc7 in MainClass::qt_metacall (this=0xbf935fc4, _c=QMetaObject::InvokeMetaMethod, _id=5, _a=0xbf13abdc) at moc_sim300_dbus.cpp:67
#25 0xb7e14f1a in QMetaObject::activate () from /usr/lib/qt-4.2.2/lib/libQtCore.so.4
#26 0xb7e159e1 in QMetaObject::activate () from /usr/lib/qt-4.2.2/lib/libQtCore.so.4
#27 0x0804df2f in Sim300Adaptor::csq_error (this=0xbf935fc4, _t1=@0xbf935a88) at moc_sim300_dbus_adaptor.cpp:112
#28 0x0804e033 in Sim300Adaptor::qt_metacall (this=0xbf935fc4, _c=QMetaObject::InvokeMetaMethod, _id=1, _a=0xbf13b10c)
    at moc_sim300_dbus_adaptor.cpp:91
#29 0x0804dcc7 in MainClass::qt_metacall (this=0xbf935fc4, _c=QMetaObject::InvokeMetaMethod, _id=5, _a=0xbf13b10c) at moc_sim300_dbus.cpp:67
#30 0xb7e14f1a in QMetaObject::activate () from /usr/lib/qt-4.2.2/lib/libQtCore.so.4
#31 0xb7e159e1 in QMetaObject::activate () from /usr/lib/qt-4.2.2/lib/libQtCore.so.4
#32 0x0804df2f in Sim300Adaptor::csq_error (this=0xbf935fc4, _t1=@0xbf935a88) at moc_sim300_dbus_adaptor.cpp:112
#33 0x0804e033 in Sim300Adaptor::qt_metacall (this=0xbf935fc4, _c=QMetaObject::InvokeMetaMethod, _id=1, _a=0xbf13b63c)
    at moc_sim300_dbus_adaptor.cpp:91

cvv ★★★★★
() автор топика
Ответ на: комментарий от alex_custov

спасибо попробую....

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

> я там кстати в примере кода случайно вместо csq_error написал просто csq

Где именно, если не секрет? я пытался собрать код во что-то работающее и в общем-то потерпел фиаско.

teferiincub
()
Ответ на: комментарий от teferiincub

Ок надеюсь к вечеру или завтра довыложить собирающийся и запускающийся код

PS:через moc пропускал? я пользовал Qt 4.2

cvv ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.