crossplatform.ru

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


  Ответ в Обмен сигнал-слотами крашится
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
cupersuper Дата 12.11.2015, 13:02
  Решил проблему.

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

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

a();

Если хотите устроить такой обмен, используйте либо QTimer::singleShot(0, go/back), чтобы поток вернулся в цикл обработки событий, прежде чем вызывать метод.
Либо откажитесь от такого циклического вызова. Кстати зачем он вам? Возможно вы решаете не ту проблему.
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 килобайт ) Кол-во скачиваний: 175
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 2.8.2025, 5:37