Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: blood_shadow от Май 20, 2011, 16:57



Название: Передать большой объект
Отправлено: blood_shadow от Май 20, 2011, 16:57
Допустим есть класс потомок QThread, ф-ция run которого выглядит примерно так:
Код
C++ (Qt)
void newThread::run()
{
   ThreadObject threadObject;
   exec();
}
 

в другом потоке создается объект и вызывается обработка событий, допустим какое-то событие
вызывает слот объекта threadObject, например parseMessage():
Код
C++ (Qt)
void ThreadObject::parseMessage()
{
   // ...
}
 

В этой ф-ции (parseMessage()) происходит нарезка где-то на 20Мб,
надо передать эту инфу другому объекту и другому потоку(объекту SomeObject, который живет
в гуи-потоке)
передавать путем копирования параметров в соединениях сигнал-слот выглядит
как не рационально, ссылку передавать как-то не безопасно, как лучше поступить в данном случае?


Название: Re: Передать большой объект
Отправлено: Fess от Май 20, 2011, 19:38
Писать большой объект в SharedMemory, а через сигнал/слот уведомлять о доступности и расположении.
http://doc.qt.nokia.com/latest/qsharedmemory.html


Название: Re: Передать большой объект
Отправлено: BRE от Май 20, 2011, 19:43
Писать большой объект в SharedMemory, а через сигнал/слот уведомлять о доступности и расположении.
А зачем?
Данные должны быть доступны для разных потоков одного процесса, т.е. все данные и так в одном адресном пространстве.
Нужно просто обеспечить синхронизацию доступа (почитать про всякие разные mutex, readwritelocker'ы, ...), ну или сигналами сообщать (подготовил порцию данных в одном буфере - послал сигнал с ссылкой на этот буфер, и начал формировать новую порцию данных в другом буфере).


Название: Re: Передать большой объект
Отправлено: blood_shadow от Май 20, 2011, 20:09
Писать большой объект в SharedMemory, а через сигнал/слот уведомлять о доступности и расположении.
А зачем?
Данные должны быть доступны для разных потоков одного процесса, т.е. все данные и так в одном адресном пространстве.
Нужно просто обеспечить синхронизацию доступа (почитать про всякие разные mutex, readwritelocker'ы, ...), ну или сигналами сообщать (подготовил порцию данных в одном буфере - послал сигнал с ссылкой на этот буфер, и начал формировать новую порцию данных в другом буфере).
та знаю я что такое примитивы синхронизации, но чтобы синхронизировать доступ как вы предлагаете
в первом варианте нужно использовать подключение хэдеров и статические мьютексы/семафоры
(потому как объекты о друг друге вообще ничего не знают)
а можно подробнее про этот буфер, как он создается и с помощью чего? или это с помощью старого доброго new?


Название: Re: Передать большой объект
Отправлено: BRE от Май 20, 2011, 20:22
та знаю я что такое примитивы синхронизации, но чтобы синхронизировать доступ как вы предлагаете
в первом варианте нужно использовать подключение хэдеров и статические мьютексы/семафоры
(потому как объекты о друг друге вообще ничего не знают)
Здесь не очень понял про проблемы с подключением хэдеров и статическими мьютексами? Мьютексы не обязательно будут статическими, да и подключение хедера не так страшно.  ::)

а можно подробнее про этот буфер, как он создается и с помощью чего? или это с помощью старого доброго new?
Можно через new, можно использовать какой нибудь контейнер.