Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Опять про сигналы и слоты 
:(
    Опции темы
xbarmaglot
Дата 31.10.2012, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.8.2012

Репутация: нет
Всего: нет



Попробовал следующее
*.h
Код

#pragma once

#include <QObject>
#include <QThread>

class Thread : public QThread {
    Q_OBJECT
private:
    virtual void run(void);

public:
    explicit Thread (QObject* parent = 0) : QThread(parent){}
    virtual ~Thread () {}

signals:
    void send(const QString& data);
};

class Receiver : public QObject {
    Q_OBJECT
public :
    explicit Receiver (QObject* parent = 0) : QObject(parent) {}
    virtual ~Receiver () {}

public slots:
    void recv (const QString& data);
};


*.cpp
Код

#include "main.h"
#include <QtCore/QCoreApplication>
#include <QDebug>

struct Helper : public QThread
{
    static void msleep (uint msecs) { QThread::msleep(msecs); }
};

void Thread::run( void )
{
    qDebug() << "Create data";
    QString* data = new QString("data");
    emit send(*data);
    data->~QString();
    data = new(data) QString("new data"); 
    qDebug() << "Delete data";
    delete data;
}

void Receiver::recv( const QString& data )
{
    Helper::msleep(1000);
    qDebug() << data;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Thread thread; Receiver receiver;
    QObject::connect(&thread, SIGNAL(send(const QString&)), &receiver, SLOT(recv(const QString&)));
    thread.start();
    return a.exec();
}


1. К моменту работы слота объект удален и даже перезаписан для надежности.
Но в слот приходит первоначальное значение. Так передача происходит по значению ?

2. Попробовал даже такое
QObject::connect(&thread, SIGNAL(send(QString)), &receiver, SLOT(recv(QString)));
То же самое.

Получается, что тип передаваемых значений вообще не имеет значения ?
Все-равно передача по значению, а не по ссылке ?

Это сообщение отредактировал(а) xbarmaglot - 31.10.2012, 21:23
PM MAIL   Вверх
boostcoder
Дата 31.10.2012, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 4
Всего: 110



Цитата(xbarmaglot @  31.10.2012,  19:44 Найти цитируемый пост)
по значению ?

да.
не помню, но возможно по ссылке будет происходить, если в типе подключения указать DirectConnection (или как оно там правильно пишется?)


PM WWW   Вверх
xbarmaglot
Дата 31.10.2012, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.8.2012

Репутация: нет
Всего: нет



boostcoder, попробовал создать приемник в самом потоке
Код

void Thread::run()
{
    receiver = new Receiver;
    QObject::connect(this, SIGNAL(send(const QString&)), receiver, SLOT(recv(const QString&)));
        ...
}


так вод delete отработал только после отработки слота.
Получается, что был выбран режим с блокированием очереди.
Прямой вызов выбирается похоже если оба объекта созданы в одном потоке и emit в этом же потоке (если явно это не указано).

P.S. Так получается, что сигнатура методов не имеет значения ?
PM MAIL   Вверх
boostcoder
Дата 31.10.2012, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 4
Всего: 110



Цитата(boostcoder @  31.10.2012,  19:48 Найти цитируемый пост)
DirectConnection


PM WWW   Вверх
xbarmaglot
Дата 31.10.2012, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.8.2012

Репутация: нет
Всего: нет



boostcoder, я не к тому как вызвань напрямую, а к тому, что получается нет необходимости парится как передавать 
данные в слот - по ссылке или по значению. Moc сам выберет.

Кстати- попробовал вывести адреса
Код

#include "main.h"
#include <QtCore/QCoreApplication>
#include <QDebug>

struct Helper : public QThread
{
    static void msleep (uint msecs) { QThread::msleep(msecs); }
};

void Thread::run( void )
{
    QString* data = new QString("data");
    qDebug() << "Create data: " << data;
    emit send(*data);
    delete data;
}

void Receiver::recv( const QString& data )
{
    qDebug() << data << ": " << &data;
    Helper::msleep(1000);
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Thread thread;
    Receiver receiver;
    QObject::connect(&thread, SIGNAL(send(const QString&)), &receiver, SLOT(recv(const QString&)));
    //QObject::connect(&thread, SIGNAL(send(QString)), &receiver, SLOT(recv(QString)));
    thread.start();
    return a.exec();
}


Действительно разные адреса
PM MAIL   Вверх
xbarmaglot
Дата 31.10.2012, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.8.2012

Репутация: нет
Всего: нет



и как все-таки - идентичны эти записи или нет ?
QObject::connect(&thread, SIGNAL(send(const QString&)), &receiver, SLOT(recv(const QString&)));
QObject::connect(&thread, SIGNAL(send(QString)), &receiver, SLOT(recv(QString)));

Похоже, что да. Адреса при DirectConnection одинаковые. Значит передача по ссылке для второй записи, а не по значению...
PM MAIL   Вверх
boostcoder
Дата 31.10.2012, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 4
Всего: 110



Цитата(xbarmaglot @  31.10.2012,  20:46 Найти цитируемый пост)
я не к тому как вызвань напрямую, а к тому, что получается нет необходимости парится как передавать

ну извиняйте, я не попугай, третий раз повторять не буду.

PM WWW   Вверх
xbarmaglot
Дата 1.11.2012, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.8.2012

Репутация: нет
Всего: нет



Цитата(boostcoder @  31.10.2012,  22:28 Найти цитируемый пост)
ну извиняйте, я не попугай, третий раз повторять не буду.


boostcoder, ты 3 раза говорил про DirectConnection. Я не могу понять как это связано с воими другими вопросами.
PM MAIL   Вверх
boostcoder
Дата 1.11.2012, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 4
Всего: 110



Цитата(xbarmaglot @  1.11.2012,  10:48 Найти цитируемый пост)
Я не могу понять как это связано с воими другими вопросами. 

для того чтоб это понять, нужно понимать как работают сигнал-слоты.
как один из намеков, я предложил соединить сигнал со слотом используя DirectConnection, ибо, возможно это подтолкнуло бы тебя к размышлениям.

Добавлено через 10 минут и 57 секунд
Цитата(boostcoder @  1.11.2012,  10:52 Найти цитируемый пост)
нужно понимать как работают сигнал-слоты.

точнее, нужно понять как реализованы сигнал-слоты.
и начинать нужно с разбора генерируемого moc-файла.


Это сообщение отредактировал(а) boostcoder - 1.11.2012, 10:55
PM WWW   Вверх
boostcoder
Дата 1.11.2012, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 4
Всего: 110



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

PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1050 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.