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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Потоки (QThread) и сигналы  (Прочитано 9162 раз)
vunder
Гость
« : Июнь 24, 2010, 11:01 »

Есть приложение с потоком. Поток предназначен для работы с сетью и при получении данных высылает сигналы с результатами. В качестве результатов выступают классы. Как лучше их передавать, чтобы не было утечки памяти?
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #1 : Июнь 24, 2010, 11:11 »

Цитировать
В качестве результатов выступают классы
Не путай объекты и классы.
Цитировать
Как лучше их передавать, чтобы не было утечки памяти?
Передавать указатели и удалять в нужный момент (delete). Надо смотреть код, чтобы понять что тебе нужно.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
vunder
Гость
« Ответ #2 : Июнь 24, 2010, 12:14 »

А что на счет передачи объектов по ссылке?
Код
C++ (Qt)
void MainWindow::onSpectrumResult(const ResultItem &result)
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #3 : Июнь 24, 2010, 12:45 »

Можно и так. Не пойму о какой утечке памяти идет речь. Если объект создается(в стеке например, не через new) в функции принятия данных, то проблем вообще никаких. Ты передаешь ссылку, сигнал отработает и вернет управление в функцию, в конце которой твои объекты сами удалятся. Так что никаких утечек не будет.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
vunder
Гость
« Ответ #4 : Июнь 24, 2010, 15:09 »

Можно и так. Не пойму о какой утечке памяти идет речь. Если объект создается(в стеке например, не через new) в функции принятия данных, то проблем вообще никаких. Ты передаешь ссылку, сигнал отработает и вернет управление в функцию, в конце которой твои объекты сами удалятся. Так что никаких утечек не будет.
Это в случае прямого вызова функций. У меня это сигналы, причем в разных потоках. В параметрах connect стои тип соединения auto. Насколько я помню, в этом случае, если получатель и отправитель в разных потоках, то вызов ставиться в очередь (или что-то подобное). Что-то я не уверен, что вызов отправителя при этом блокируется
Записан
Amigo_sa
Гость
« Ответ #5 : Июнь 24, 2010, 17:10 »

А что на счет передачи объектов по ссылке?
Код
C++ (Qt)
void MainWindow::onSpectrumResult(const ResultItem &result)

Нужно иметь в виду что для сигналов-слотов параметры копируются, это во-первых, лишний вызов копирующего конструктора для ResultItem, а во-вторых, если исходный item поменяется, слот об этом ничего не узнает.
Записан
explosionhead
Гость
« Ответ #6 : Июнь 24, 2010, 18:02 »

А что на счет передачи объектов по ссылке?
Код
C++ (Qt)
void MainWindow::onSpectrumResult(const ResultItem &result)

Нужно иметь в виду что для сигналов-слотов параметры копируются, это во-первых, лишний вызов копирующего конструктора для ResultItem, а во-вторых, если исходный item поменяется, слот об этом ничего не узнает.
параметры-ссылки не копируются. Но в данном случае тип соединения QueuedConnection и ссылки передавать нельзя
Используй умный указатель, например std::auto_ptr
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Июнь 24, 2010, 19:41 »

параметры-ссылки не копируются. Но в данном случае тип соединения QueuedConnection и ссылки передавать нельзя
Используй умный указатель, например std::auto_ptr
С точностью до наоборот  Улыбающийся Для QueuedConnection - ссылки как раз копируются. в остальном QueuedConnection - это как PostMessage в Вындоуз. Привлекать auto_ptr не имеет смысла, т.к. он создается в контексте сигнала и может грохнуть данные в неподходящий момент.

В параметрах connect стои тип соединения auto. Насколько я помню, в этом случае, если получатель и отправитель в разных потоках, то вызов ставиться в очередь
Если получатель и отправитель были СОЗДАНЫ в разных потоках, это важно.

(или что-то подобное). Что-то я не уверен...
Возникает впечатление что Вас заставляют заниматься программированием. Может лучше переключиться на живопись или музыку, где интуитивная компонента больше?  Улыбающийся
Записан
explosionhead
Гость
« Ответ #8 : Июнь 24, 2010, 20:29 »

да, действительно я ошибался относительно QueuedConnection - он скопирует данные. Тогда нечего волноваться относительно вызова копирующего конструктора - он будет вызван в любом случае при этом виде соединений.
Хотя если автор уточнит постановку задачи, то ситуация прояснится. Возможно устроит и обычный DirectConnection
Записан
vunder
Гость
« Ответ #9 : Июнь 25, 2010, 08:09 »

Итак, как я понял лучше передавать ссылку на объект, избегая тем самым дополнительный вызов конструктора, а в слоте необходимо будет вызвать delete <object>?
Записан
galilley
Гость
« Ответ #10 : Июнь 25, 2010, 09:26 »

А какой объект-то хоть передаётся, и чем плох вызов копирующего конструктора.
Я у себя через сигналами кидаюсь объектами, меньше возни с delete <object> и об утечках не надо заботиться, однако тут надо смотреть на объём этих самих данных и частоту сигналов.
Записан
vunder
Гость
« Ответ #11 : Июнь 25, 2010, 09:35 »

А какой объект-то хоть передаётся, и чем плох вызов копирующего конструктора.
Я у себя через сигналами кидаюсь объектами, меньше возни с delete <object> и об утечках не надо заботиться, однако тут надо смотреть на объём этих самих данных и частоту сигналов.

Код
C++ (Qt)
class SpectrumResultItem: public CustomResultItem
{
public:
   SpectrumResultItem();
   QList<float> floatSpectrum;
   QList<float> floatPhases;
   SpcKind kind;
   void setSpectrumData(const QString &strKind, QByteArray &data);
};
 
Отсчетов может быть до 300 (на оба поля floatSpectrum и floatPhases), т.е. до 1200 байт. Но это максимум. Обычно 150, т.е. 600 байт.
Данные будут приходить около 3-4 раз в секунду. Да и то это не постоянный режим работы. Это может длится несколько минут (а то и несколько секунд)
Записан
explosionhead
Гость
« Ответ #12 : Июнь 25, 2010, 10:39 »

по идее если ты не будешь изменять содержимое контейнеров floatSpectrum и floatPhases, то оно не будет копироваться
да, кстати, а чем оправдано использование QList<T>? для твоей задачи правильнее использовать QVector<T>
Записан
vunder
Гость
« Ответ #13 : Июнь 25, 2010, 10:42 »

по идее если ты не будешь изменять содержимое контейнеров floatSpectrum и floatPhases, то оно не будет копироваться
да, кстати, а чем оправдано использование QList<T>? для твоей задачи правильнее использовать QVector<T>
Да, действительно. Я как-то забыл про него
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Июнь 25, 2010, 10:45 »

Я бы смотрел самый простой вариант: передать нитке указатели на контейнеры (QList) и пусть нитка их заполняет. А главная отвечает за создание контейнеров, их зачистку и.т.п. Нет проблем с копированием и конструкторами. А можно и не передавать в сигнале, а сделать указатели членами класса нитки.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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