Russian Qt Forum
Апрель 20, 2024, 00:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 178 179 [180] 181 182 ... 188
2686  Qt / Общие вопросы / Re: Сигналы, слоты + передача с помощью них данных? : Февраль 11, 2009, 09:30
В общем попробовал передавать в качестве параметра data массив QByteArray на 1000000 элементов
1. Если передавать как QByteArray то среднее время = 0,0011648
2. Если передвать как const QByteArray & то среднее время = 0,00104065

т.е прирост скорости около 10-12 %
2687  Qt / Общие вопросы / Re: Что означает QWidget(parent) в списке инициализаторов? : Февраль 10, 2009, 11:41
Не изменится Улыбающийся
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) ?
2689  Qt / Общие вопросы / Re: Сигналы, слоты + передача с помощью них данных? : Февраль 06, 2009, 15:04
Цитировать
В примере измеряется именно это...
хм... по ходу вы правы Улыбающийся (я долго думал)
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* в требуемый тип...

т.е? и что это значит? Улыбающийся

(т.е. на что это сказывается и т.п)

ЗЫ: только по рабоче-крестьянски пжлста...
2695  Qt / Общие вопросы / Re: Сигналы, слоты + передача с помощью них данных? : Февраль 05, 2009, 16:42
Улыбающийся ну это вроде понятно..
а вот между 2 и 3 ?
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.. (из тех примеров что мне попадались)

и еще... а когда целесообразно при передаче параметров писать ключевое слово :
Код:
const

Непонимающий
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 , и посмотри все-таки ту ссылку шо я привел.. т.к там именно то что тебе нужно (ИМХО).. и не важно что там не сокеты! Улыбающийся
т.к. там рассматривался "общий" пример по сути принципа создания потоков и выполнению методов в ЭТИХ потоках, а не в главном потоке!
2700  Qt / Общие вопросы / Re: Потоки, сигналы, слоты и потенциальные касяки если связать все это? : Февраль 02, 2009, 19:36
2 Константин & 2 ВRE & 2 Dendy, спасибки за наводку ! Улыбающийся

щас проверил в Linux с таймером в 10мс - вроде не кушает память.. завтра проверю в WinXP Улыбающийся

ЗЫ: за то что я не корректно в примерах высвобождаю указатели - просьба не бить жестко, т.к примерчики чисто теоретическо-практического-тестового плана!
Страниц: 1 ... 178 179 [180] 181 182 ... 188

Страница сгенерирована за 0.057 секунд. Запросов: 23.