Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обмен сигнал-слотами крашится
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
cupersuper
Объект 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();
}

Нажмите для просмотра прикрепленного файла
lanz
Поскольку оба объекта в одном потоке, вызовы слотов происxодят как вызовы обычных функций и получается бесконечная рекурсия:
void a() {
b();
}
void b() {
a();
}

a();

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

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

lanz, спасибо, через QTimer тоже можно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2021 IPS, Inc.