2686
|
Qt / Общие вопросы / Re: Сигналы, слоты + передача с помощью них данных?
|
: Февраль 11, 2009, 09:30
|
В общем попробовал передавать в качестве параметра data массив QByteArray на 1000000 элементов 1. Если передавать как QByteArray то среднее время = 0,0011648 2. Если передвать как const QByteArray & то среднее время = 0,00104065
т.е прирост скорости около 10-12 %
|
|
|
2688
|
Qt / Общие вопросы / Re: Что означает QWidget(parent) в списке инициализаторов?
|
: Февраль 10, 2009, 08:36
|
а я понимаю так, что то что выделено жирным - это просто для укорочения записи.. например: есть класс: *.h class MyClass: public QObject { Q_OBJECT public: MyClass(int Param1, int Param2); private: int Par1; int Par2; };
и в реализации мы можем написать двумя путями: 1. MyClass::MyClass(int Param1, int Param2) { Par1 = Param1; Par2 = Param2; }
2. MyClass::MyClass(int Param1, int Param2) : Par1(Param1), Par2(Param2) {
}
Я так понимаю, что это одно и тоже... Но вот именно с параметром parent я тоже не знаю... Изменится ли что нибудь если не писать : QWidget(parent) ?
|
|
|
2690
|
Qt / Общие вопросы / Re: Сигналы, слоты + передача с помощью них данных?
|
: Февраль 06, 2009, 15:03
|
в общем сделал так: (на примере передачи-приема int ) al.h #ifndef AL_H #define AL_H #include <QTime> #include <QDebug>
#define LIMIT 4000000
class TMyClass : public QObject { Q_OBJECT signals: void mySignal(int data); public: TMyClass() { cnt = 0; srcData = 0; dstData = 0; connect( this, SIGNAL(mySignal(int)), this, SLOT(mySlot(int)) ); } void myStart() { srcData = 333;//в переменную пишем число 333 time = QTime::currentTime();//получаем текущее время до старта for ( int i = 0; i < LIMIT; ++i ) {// LIMIT раз емиттим сигнал с данными ++cnt;//счетчик кол-ва итераций emit mySignal( srcData ); } } private slots: void mySlot(int data) { dstData = data;//копируем в переменную dstData содержимое переменной data if (cnt == LIMIT) qDebug() << "Time for one cicle ~ " << (float)time.elapsed()/LIMIT;//получаем среднее время цикла обработки //qDebug() << "data = " << dstData; } private: QTime time; int cnt; int srcData; int dstData; }; #endif // AL_H
main.cpp #include <QtCore> #include <QCoreApplication>
#include "al.h"
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); TMyClass *MyClass = new TMyClass(); MyClass->myStart(); return a.exec(); }
итак в результате 5-ти запусков программы имеем: 1. если передавать int - то время около 0.000961 2. если передавать const int & - то время около 0.000970 3. если передавать int * - то время около 0.000965 т.е с простыми типами данных впринципе наверное одинаково... ЗЫ: попожжа попробую передавать структуру, массив
|
|
|
2691
|
Qt / Общие вопросы / Re: Сигналы, слоты + передача с помощью них данных?
|
: Февраль 06, 2009, 14:00
|
нет, это не то... в этом примере оценивается только время емиттинья сигнала...
а мне (нам) необходимо оценить время, прошедшее от еммитинья сигнала (передачи переменной) до приема сигнала (до того как эту переменную в слоте прочитали)... т.е время цикла: обработка-передача-прием-обработка
вопрос: есть ли в QT какая нить ф-я для подсчета кол-ва тиков процессора и т.п., т.к оценить время не представляется возможным т.к. оно оч мало
|
|
|
2692
|
Qt / Общие вопросы / Re: Сигналы, слоты + передача с помощью них данных?
|
: Февраль 06, 2009, 12:54
|
И что в итоге быстрее? я тоже хочу это знать! Тоже самое и со ссылкой, которая есть ничто иное как разыименованный указатель. так сколько затрачивается шагов в среднем? как это определить? если: 1. я передаю переменную с помошью сигнал - слот 2. я передаю ссылку с помошью сигнал - слот 3. я передаю указатель с помощью сигнал-слот
|
|
|
2693
|
Qt / Общие вопросы / Re: Сигналы, слоты + передача с помощью них данных?
|
: Февраль 06, 2009, 12:50
|
так в каких случаях будет временно копирование происходить а в каких нет и если будет - то сколько раз оно будет происходить за передачу? 1. Я передаю через сигнал-слот переменные типов: int,byte,bool - да/нет и сколько раз 2. Я передаю через сигнал-слот ссылку переменной типов: const int &,const byte &,const bool & (и т.п.) - да/нет и сколько раз 3. Я передаю через сигнал-слот ссылку строки типа: const QString & - да/нет и сколько раз 4. Я передаю через сигнал-слот переменную типа QObject (в общем случае): QObject - да/нет и сколько раз 5. Я передаю через сигнал-слот ссылку типа QObject (в общем случае): const QObject & - да/нет и сколько раз 6. Я передаю через сигнал-слот свою переменную типа TUserDadaType (в общем случае являющуюся просто классом или структурой, не наследованной ни от чего): TUserDadaType - да/нет и сколько раз 6. Я передаю через сигнал-слот свою ссылку переменной типа TUserDadaType (в общем случае являющуюся просто классом или структурой, не наследованной ни от чего): const TUserDadaType & - да/нет и сколько раз ЗЫ: я спрашиваю, потому что у меня приложение собирается быть "большим", т.е многопоточным и должен большой объем данных обрабатываться + ко всему, нужно все это делать как можно быстрее!! т.е скорость должна быть на максимуме! и передачу данных между объектами приложения я пока планирую делать с помощью сигналов-слотов! т.е каждая операция копирования , пересылки и т.п у меня на счету!
|
|
|
2694
|
Qt / Общие вопросы / Re: Сигналы, слоты + передача с помощью них данных?
|
: Февраль 06, 2009, 08:27
|
эмм...не забываем, что для {,Blocking}QueuedConnection все данные копируются через QMetaType::create(), а потом кастятся из void* в требуемый тип... т.е? и что это значит? (т.е. на что это сказывается и т.п) ЗЫ: только по рабоче-крестьянски пжлста...
|
|
|
2696
|
Qt / Общие вопросы / Re: Сигналы, слоты + передача с помощью них данных?
|
: Февраль 05, 2009, 16:30
|
я говорил не об указателях, а о ссылках: connect(table->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), this, SLOT(currentChanged()) ); я ща попробовал с int такое провернуть... работает! но все-таки интересно что быстрее... 1. передавать: data или 2. передавать: *data или 3. передавать: const &data
|
|
|
2697
|
Qt / Общие вопросы / Re: Сигналы, слоты + передача с помощью них данных?
|
: Февраль 05, 2009, 16:19
|
для инта пожалуй все равно, а если посмотреть на то как делают троли, то видно, что для собственных типов данных используют ссылки. пример в студию! ------ т.е 1. если я например в качестве данных передаю например QList - то в классе A писать: signals: void sgFromA(QList<*MyDataTypes> *data);
в классе B писать: public slots: void slotB(QList<*MyDataTypes> *data);
в main писать: QObject::connect(cA, SIGNAL(sgFromA(QList<*MyDataTypes> *)), cB, SLOT(slotB(QList<*MyDataTypes> *));
?? 2. а если я передаю какой-то свой тип данных типа структуры или класса то: в классе A писать: signals: void sgFromA(MyDataTypes *data);
в классе B писать: public slots: void slotB(MyDataTypes *data);
в main писать: QObject::connect(cA, SIGNAL(sgFromA(MyDataTypes *)), cB, SLOT(slotB(MyDataTypes *));
мне интересно поподробнее это узнать, т.к везде в примерах передают или int или QString.. (из тех примеров что мне попадались) и еще... а когда целесообразно при передаче параметров писать ключевое слово :
|
|
|
2698
|
Qt / Общие вопросы / Сигналы, слоты + передача с помощью них данных?
|
: Февраль 05, 2009, 16:02
|
доброго дня! = случай №1 = (передаем с помощью сигналов и слотов между объектов ДАННЫЕ!) main.cpp #include <QtCore> #include <QCoreApplication>
#include "ab.h"
int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); A *cA = new A(); B *cB = new B(); QObject::connect(cA, SIGNAL(sgFromA(int)), cB, SLOT(slotB(int))); //тут по значению передача данных происходит!!! cA->slotA();//запускаем таймер return app.exec(); }
ab.h #ifndef AB_H #define AB_H #include <QDebug> #include <QTimer>
class A : public QObject { Q_OBJECT signals: void sgFromA(int data); public: A() { cnt = 0; } public slots: void slotA() {//выполняем этот слот сами один раз в main qWarning() << "A::slotA() -> GO GO GO"; QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(slotA1())); timer->start(1000); } void slotA1() {//этот слот класса А будет емиттить сигнал с данными для слота В ++cnt; qWarning() << "A::slotA1() -> sended CNT = " << cnt; emit sgFromA(cnt);//здесь передаем ЗНАЧЕНИЕ переменной! } private: int cnt;//типа счетчик };
class B: public QObject { Q_OBJECT public slots: void slotB(int data) {//этот слот класса В будет принимать сигнал от класса А с данными qWarning() << "B::slotB() -> received CNT = " << data; } }; #endif // AB_H
= случай №2 = (передаем с помощью сигналов и слотов между объектов УКАЗАТЕЛИ НА ДАННЫЕ!) main.cpp #include <QtCore> #include <QCoreApplication>
#include "ab.h"
int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); A *cA = new A(); B *cB = new B(); QObject::connect(cA, SIGNAL(sgFromA(int *)), cB, SLOT(slotB(int *))); cA->slotA();//запускаем таймер return app.exec(); }
ab.h #ifndef AB_H #define AB_H #include <QDebug> #include <QTimer>
class A : public QObject { Q_OBJECT signals: void sgFromA(int *data); public: A() { cnt = 0; } public slots: void slotA() {//выполняем этот слот сами один раз в main qWarning() << "A::slotA() -> GO GO GO"; QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(slotA1())); timer->start(1000); } void slotA1() {//этот слот класса А будет емиттить сигнал с данными для слота В ++cnt; qWarning() << "A::slotA1() -> sended CNT = " << cnt; emit sgFromA(&cnt); //здесь передаем АДРЕС переменной! } private: int cnt;//типа счетчик };
class B: public QObject { Q_OBJECT public slots: void slotB(int *data) {//этот слот класса В будет принимать сигнал от класса А с данными qWarning() << "B::slotB() -> received CNT = " << *data;// } }; #endif // AB_H
варианты №1 и №2 работают в конечном счете одинаково, НО: 1. Хотелось бы узнать, а в каком случае после компиляции проекта будут БЫСТРЕЕ обратываться данные и меньше будет использование памяти? ( т.е в случае №1 - создается дополнительная переменная int data в которую сначала копируется результат счетчика, потом из нее забирается он, а в случае №2 все идет по адресу ... т.е мое ИМХО - что так будет быстрее и меньше памяти будет использоваться) 2. Или это не имеет значения, т.к компилятор все-равно оптимизирует код?
|
|
|
2699
|
Qt / Работа с сетью / Re: Работа с потоками
|
: Февраль 04, 2009, 10:22
|
У меня клиент-серверное приложение, сокет(клиента) я создал в основном потоке, при коннекте к серверу в нем создается дочерний поток в котором создается сокет, предназначенный для общения с сокетом из основного потока. я шот не понял.. 1. а зачем спри коннекте к серверу создавать в потоке еще один сокет? 2. какой смысл обмена сигналами между сокетами одного приложения ? 2 zayac_val , и посмотри все-таки ту ссылку шо я привел.. т.к там именно то что тебе нужно (ИМХО).. и не важно что там не сокеты! т.к. там рассматривался "общий" пример по сути принципа создания потоков и выполнению методов в ЭТИХ потоках, а не в главном потоке!
|
|
|
|
|