Russian Qt Forum

Qt => Общие вопросы => Тема начата: Vld2 от Август 11, 2008, 23:23



Название: использование connect при наследовании классов
Отправлено: Vld2 от Август 11, 2008, 23:23
Код:
Class AA 
{
 public:
  go();
  readMessage();
};

AA::go()
{
 connect(pushButton, ... , SLOT(readMessage));
}

class BB :public AA
{
 readMessage();
};

int main()
{
 BB obj;
 obj.go();
}
Если сработает сигнал, то функция readmessage какого класса сработает? По идеи AA, а как сделать так чтобы именно класса ВB?


Название: Re: использование connect при наследовании классов
Отправлено: pastor от Август 12, 2008, 00:25
Сделать слот readmessage виртуальным?


Название: Re: использование connect при наследовании классов
Отправлено: ритт от Август 12, 2008, 00:27
сделать АА::readMessage виртуальным?

зы. стиль написания охеренный...до этого на пых-пыхе писал? )


Название: Re: использование connect при наследовании классов
Отправлено: Mikhail от Август 12, 2008, 09:20
сделать АА::readMessage виртуальным?

зы. стиль написания охеренный...до этого на пых-пыхе писал? )


Естественно, виртуальным.


Название: Re: использование connect при наследовании классов
Отправлено: Red Devil от Август 12, 2008, 09:41
Только лучше сделать функцию readMessage, не виртуальной, которая будет вызывать виртуальную функцию.
В какой-то книге писалось, что при использовании с сигналах и слотах виртуальной функции производительность на несколько порядков меньше.


Название: Re: использование connect при наследовании классов
Отправлено: ритт от Август 12, 2008, 10:14
кстати, да...и тролли тоже всегда так делают

в данном случае самое очевидное не есть самое правильное :)


Название: Re: использование connect при наследовании классов
Отправлено: pastor от Август 12, 2008, 12:24
В какой-то книге писалось, что при использовании с сигналах и слотах виртуальной функции производительность на несколько порядков меньше.

А вы не помните в какой книге это писалось? (Интересно читануть что нить по этому поводу)


Название: Re: использование connect при наследовании классов
Отправлено: uriel от Август 12, 2008, 12:41
Если не изменяет память, то читал это у Шлее в книге по Qt4. Только там не так много нового по сравнению с тем же ассистентом, на самом деле. ;)


Название: Re: использование connect при наследовании классов
Отправлено: Alex03 от Август 12, 2008, 12:58
В какой-то книге писалось, что при использовании с сигналах и слотах виртуальной функции производительность на несколько порядков меньше.
А вы не помните в какой книге это писалось? (Интересно читануть что нить по этому поводу)
+1 Нельзя ли текст оттуда...
Если заглянуть в любой moc_srcname.cpp то там есть функция
Код:
int ClassName::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
В которой в switch-e прямо вызываются слоты, и виртуальные, и нет. Конечно вызов виртуальной функции накладывает необходимость обращения к таблице виртуальных функций из которой берётся адрес кода самой функции, но говорить о порядках потери производительности мягко говоря нельзя (скорее наоборот).


Название: Re: использование connect при наследовании классов
Отправлено: Alex03 от Август 12, 2008, 13:04
Как пример
Код:
        case 9: setVisible((*reinterpret_cast< bool(*)>(_a[1]))); break;
        case 10: setHidden((*reinterpret_cast< bool(*)>(_a[1]))); break;
из moc_qwidget.cpp.
setVisible - виртуальный метод, setHidden - нет.


Название: Re: использование connect при наследовании классов
Отправлено: ритт от Август 12, 2008, 13:49
я не плюсовал за потерю производительности :)
виртуальные слоты в кутэ используются наряду с обычными, хоть и в меньшей пропорции (чаще из соображений совместимости); просто на мой взгляд легче читать код, когда слоты невиртуальные - набрёл на коннект, нашёл код слота - и оп-па...а он виртуальнй и здесь не используется


Название: Re: использование connect при наследовании классов
Отправлено: Hort от Август 27, 2008, 21:31
Цитировать
... Слоты могут быть и виртуальными.
Примечание
По данным фирмы Trolltech, соединение сигнала с виртуальным слотом
примерно в десять раз медленнее, чем с невиртуальным. Поэтому не стоит
делать слоты виртуальными, если нет особой необходимости.
это из книги Макса Шлее.


Название: Re: использование connect при наследовании классов
Отправлено: pastor от Август 27, 2008, 23:37
это из книги Макса Шлее.

http://doc.trolltech.com/4.4/signalsandslots.html

Цитировать
You can also define slots to be virtual, which we have found quite useful in practice.

Compared to callbacks, signals and slots are slightly slower because of the increased flexibility they provide, although the difference for real applications is insignificant. In general, emitting a signal that is connected to some slots, is approximately ten times slower than calling the receivers directly, with non-virtual function calls.

Где тут говориться про то что коннект к виртуальнм слотам медленее? Шлее жжот. Поправьте если я неправ


Название: Re: использование connect при наследовании классов
Отправлено: ритт от Август 28, 2008, 00:49
либо переводчик отжёг, либо шлее :)

падение производительности при коннекте обусловлено лишь тем, что требуется найти соединённый слот(слоты)...думаю, десятикратное падение сравнительно с прямым вызовом - пустяки
а удобство очевидно и оправдывает затраты - недаром существуют десятки проектов, повторяющих функционал сигналов/слотов в стиле кутэ или буст...


Название: Re: использование connect при наследовании классов
Отправлено: Vld2 от Сентябрь 02, 2008, 10:27
так на чем остановились? для больших программ слоты виртуальными не делать, а для малых можно


Название: Re: использование connect при наследовании классов
Отправлено: pastor от Сентябрь 02, 2008, 10:59
так на чем остановились?

Помоему остановились на том что аффтар неправильно перевел оф. документацию.