Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Pink_Panter от Октябрь 01, 2010, 15:30



Название: Передача в сигнал своего класса и его потомков в многопоточном приложении
Отправлено: Pink_Panter от Октябрь 01, 2010, 15:30
Читаю документацию, ищу в интернете и немного запутался. Не могу найти информацию именно для моего случая.
Хочу следующего:
- несколько различных объектов работают параллельно, каждый в своем потоке.
- в каждом потоке запущена очередь событий.
- объекты обмениваются информацией через механизм сигналов/слотов.
- аргумент сигнала(слота) мой класс(структура?) "сообщение" передающийся по значению?, ссылке?, указателю?
- соединения сигналов со слотами - многие ко многим (т.е. один сигнал может приходить в несколько слотов, и несколько сигналов приходить в один слот) используя Qt::QueuedConnection.
- память для "сообщения" должна выделиться перед генерацией сигнала и освободиться после обработки в последнем слоте.
- иногда возникает необходимость передать в сигнале дополнительную информацию, используя для этого потомков класса "сообщение"

Вопрос: как этого добиться? При этом не вызвав утечек памяти и Segmentation fault. Плюс хотелось бы хорошей производительности.
Каким образом нужно передавать аргумент по значению?, ссылке?, указателю?, "умному" (QSharedPointer и иже с ним) указателю?
Нужно ли и как использовать qRegisterMetaType() для "сообщения" и его потомков?

ЗЫ: в числе прочего класс "сообщение" содержит в себе QByteArray. Как его лучше хранить статически или динамически?


Название: Re: Передача в сигнал своего класса и его потомков в многопоточном приложении
Отправлено: p166 от Октябрь 01, 2010, 16:21
Использование qRegisterMetaType() :
qRegisterMetaType<TYPE_NAME>("TYPE_NAME");


Название: Re: Передача в сигнал своего класса и его потомков в многопоточном приложении
Отправлено: AlekseyK от Октябрь 27, 2010, 13:17
Посмотри примеры examples\threads\mandelbrot\ и examples\network\blockingfortuneclient\ и поймёшь как передавать данные из потока - там это хорошо разобрано.


Название: Re: Передача в сигнал своего класса и его потомков в многопоточном приложении
Отправлено: andrew.k от Ноябрь 02, 2010, 21:46
Посмотри примеры examples\threads\mandelbrot\ и examples\network\blockingfortuneclient\ и поймёшь как передавать данные из потока - там это хорошо разобрано.

там не разобрано, как в сигналах/слотах использовать свой класс и передавать его по ссылке


Название: Re: Передача в сигнал своего класса и его потомков в многопоточном приложении
Отправлено: andrew.k от Ноябрь 04, 2010, 14:11
в итоге я пришел к выводу, что по ссылке вообще нельзя передавать. Либо указатель либо константная ссылка.