crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Обмен сигнал-слотами крашится
cupersuper
  опции профиля:
сообщение 10.11.2015, 20:11
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 5.5.2011
Пользователь №: 2654

Спасибо сказали: 0 раз(а)




Репутация:   0  


Объект 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 килобайт ) Кол-во скачиваний: 40
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 11.11.2015, 10:07
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


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

a();

Если хотите устроить такой обмен, используйте либо QTimer::singleShot(0, go/back), чтобы поток вернулся в цикл обработки событий, прежде чем вызывать метод.
Либо откажитесь от такого циклического вызова. Кстати зачем он вам? Возможно вы решаете не ту проблему.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
cupersuper
  опции профиля:
сообщение 12.11.2015, 13:02
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 5.5.2011
Пользователь №: 2654

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

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

lanz, спасибо, через QTimer тоже можно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.11.2019, 19:18