Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Обмен сигнал-слотами крашится

Автор: cupersuper 10.11.2015, 20:11

Объект 1 класса отсылает сигнал объекту 2 класса, тот при получении сигнала, отвечает. Получается некий цикл. Программа завершается с ошибкой через 3580 таких итераций на Qt4.8, через 3683 на Qt4.7.
Не пойму почему крашится.

//main.cpp
int main(int argc, char *argv[])
{
...
    MainWindow w;
    Second s;
    QObject::connect( &w,SIGNAL(go()),   &s,SLOT(go()) );
    QObject::connect( &s,SIGNAL(back()), &w,SLOT(back()) );
...
}


//mainwindow.h
class MainWindow : public QMainWindow
{
...
  private:
    int VALUE;
    int MAX_VALUE;

  private slots:
    void on_pushButton_clicked();

  public slots:
    void back();

  signals:
    void go();
};


//mainwindow.cpp
void MainWindow::on_pushButton_clicked()
{
    VALUE = 0;
    MAX_VALUE = 10000;

    emit go();
}


void MainWindow::back()
{
    qDebug() << VALUE;

    if(VALUE<MAX_VALUE)
    {
        VALUE++;
        emit go();
    }
}


//second.h
class Second : public QObject
{
...
signals:
    void back();

public slots:
    void go();
};


//second.cpp
void Second::go()
{
    emit back();
}

 test2.zip ( 2.49 килобайт ) : 56

Автор: lanz 11.11.2015, 10:07

Поскольку оба объекта в одном потоке, вызовы слотов происxодят как вызовы обычных функций и получается бесконечная рекурсия:

void a() {
b();
}
void b() {
a();
}

a();

Если хотите устроить такой обмен, используйте либо QTimer::singleShot(0, go/back), чтобы поток вернулся в цикл обработки событий, прежде чем вызывать метод.
Либо откажитесь от такого циклического вызова. Кстати зачем он вам? Возможно вы решаете не ту проблему.

Автор: cupersuper 12.11.2015, 13:02

Решил проблему.

Добавил Qt::QueuedConnection и сигнал стал отправляться после отработки вызвавшей его функции.

lanz, спасибо, через QTimer тоже можно.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)