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

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Сигналы, слоты + передача с помощью них данных?  (Прочитано 27756 раз)
BRE
Гость
« Ответ #15 : Февраль 06, 2009, 14:09 »

нет, это не то... в этом примере оценивается только время емиттинья сигнала...
Как ты себе представляешь [эмиттинье] сигнала?

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

т.к оценить время не представляется возможным  т.к. оно оч мало
Для этого и используется в цикле много итераций.
Записан
Rcus
Гость
« Ответ #16 : Февраль 06, 2009, 14:31 »

вопрос: есть ли в QT какая нить ф-я для подсчета кол-ва тиков процессора и т.п., т.к оценить время не представляется возможным  т.к. оно оч мало
http://doc.trolltech.com/4.5/qtestlib-manual.html#creating-a-benchmark
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #17 : Февраль 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

т.е с простыми типами данных впринципе наверное одинаково...

ЗЫ: попожжа попробую передавать структуру, массив
Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #18 : Февраль 06, 2009, 15:04 »

Цитировать
В примере измеряется именно это...
хм... по ходу вы правы Улыбающийся (я долго думал)
« Последнее редактирование: Февраль 06, 2009, 15:10 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #19 : Февраль 11, 2009, 09:30 »

В общем попробовал передавать в качестве параметра data массив QByteArray на 1000000 элементов
1. Если передавать как QByteArray то среднее время = 0,0011648
2. Если передвать как const QByteArray & то среднее время = 0,00104065

т.е прирост скорости около 10-12 %
Записан

ArchLinux x86_64 / Win10 64 bit
ритт
Гость
« Ответ #20 : Февраль 11, 2009, 10:14 »

зачем тестировать данные шаренных типов? и так понятно, что разница будет не столь существенна.
вот, к примеру, тест http://labs.trolltech.com/blogs/2009/01/23/iterating-efficiently/ - сравнение выборки (передачи) приведено в таблице.

подитожу то, что многократно уже было сказано (здесь и не только):
при передаче данных через события
* для простых типов (int, bool) используй простые типы (int, bool)
* для шаренных типов (QString, QVariant) используй ссылки (желательно константные) (const QString&, const QVariant&)
* для произвольных типов (нешаренных и непростых) (struct MyStruct, class MyClass) используй ссылки и указатели (const MyStruct&, MyClass*), только если не разрушаешь сущности после отправки (иначе сегфолт). плюс не забывай регистрировать произвольные типы в метаобъектной системе.

упд по последнему пункту: если необходимо разрушить сущности после отправки (выход из функции и т.п.), либо используй передачу с ожиданием (Qt::BlockingQueuedConnection), либо передавай указатели и уничтожай в слоте после отработки.
« Последнее редактирование: Февраль 11, 2009, 10:17 от Константин » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #21 : Февраль 11, 2009, 10:46 »

2 Константин ,
спасибо большое! Улыбающийся Вот этой конкретики и ождал услышать!

только вот насчет разрушения...

например я делаю так:
1.
Код:
void MyClass::MyFunc()
{
   TMyData MyData;
   ...
   ...
   emit (&MyData);
}
тут после выполнения ф-ции MyFunc() , объект MyData автоматически разрушится? т.е так нельзя?
2.
Код:
void MyClass::MyFunc()
{
   TMyData *MyData = new TMyData;
   ...
   ...
   emit (MyData);
}
а вот так можно?

« Последнее редактирование: Февраль 11, 2009, 10:52 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
manarch
Гость
« Ответ #22 : Февраль 11, 2009, 10:58 »

Подскажите кто знает. Необходимо передавать небольшой массив данных, причем объем этих данных может менятся, поэтому они выделяются динамически. Возможна передача между несколькими потоками и в виде "точка-многоточка". В ассенте написанно что если передача происходит между разными потоками или тип сигнала Qt::QueuedConnection, то сигнал ставится в очередь. В этом месте и есть загвоздка, т.к. если выделять данные динамически и при этом выделять их локально, то возникает проблема освобождения память выделенной по эти данные. Подскажите как узнать все ли потоки получили эти данные и их можно удалить? При этом информаци о количестве потоков неизвестна, и поэтому счетчик количества потоков обработавших данные внутри структуры этих данных исключается.
Записан
ритт
Гость
« Ответ #23 : Февраль 11, 2009, 11:24 »

использовать данные шаренного типа. например, QByteArray или QVariant
Записан
BRE
Гость
« Ответ #24 : Февраль 11, 2009, 11:48 »

например я делаю так:
1.
Код:
void MyClass::MyFunc()
{
   TMyData MyData;
   ...
   ...
   emit (&MyData);
}
тут после выполнения ф-ции MyFunc() , объект MyData автоматически разрушится? т.е так нельзя?
Хочу немного добавить.
Нужно понимать, что делаешь. Например, в некоторых случаях можно использовать следующий код.
Код
C++ (Qt)
void MyClass::MyFunc()
{
  TMyData data;
  emit request( data );
 
  // Обработали данные
  if( data.var1 == 1234 )
      ....
 
  // data - разрушился, ибо нефик.
}
 
void MyLister::request( MyData &data )
{
   // Заполнили поля структуры
   data.var1 = 1234;
   data.var2 = 5678;
}
 

Записан
ритт
Гость
« Ответ #25 : Февраль 11, 2009, 11:56 »

BRE, нельзя, если речь идёт об асинхронном вызове. если при этом TMyData - шаренный тип, то можно...но смысла в контексте примера выше 0.
Записан
BRE
Гость
« Ответ #26 : Февраль 11, 2009, 11:59 »

BRE, нельзя, если речь идёт об асинхронном вызове.
Поэтому, я сразу написал "в некоторых случаях".  Улыбающийся
Если человек понимает что делает, то можно.
Записан
Dendy
Гость
« Ответ #27 : Февраль 12, 2009, 10:58 »

2 manarch. Лучше всего засунуть ваши данные в QSharedDataPointer, превратив их в Implicitly Shared класс. Таким образом копирование для чтения будет атомарной операцией, обьект будет уничтожен когда уничтожится последняя ссылка на него, передавать такой класс можно безопастно между потоками, самому удалять данные не нужно. Подробней в документации по QSharedDataPointer.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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