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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передать большой объект  (Прочитано 3338 раз)
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, который живет
в гуи-потоке)
передавать путем копирования параметров в соединениях сигнал-слот выглядит
как не рационально, ссылку передавать как-то не безопасно, как лучше поступить в данном случае?
Записан
Fess
Гость
« Ответ #1 : Май 20, 2011, 19:38 »

Писать большой объект в SharedMemory, а через сигнал/слот уведомлять о доступности и расположении.
http://doc.qt.nokia.com/latest/qsharedmemory.html
Записан
BRE
Гость
« Ответ #2 : Май 20, 2011, 19:43 »

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

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

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

а можно подробнее про этот буфер, как он создается и с помощью чего? или это с помощью старого доброго new?
Можно через new, можно использовать какой нибудь контейнер.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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