crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> QMap + QThread
AXELman4ever
  опции профиля:
сообщение 27.10.2011, 12:21
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 22.9.2011
Пользователь №: 2902

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день!

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

Посему хочу просить помощь в просвещении того как ораганизовать подобную связку.

1-ое:
Имеется 2 дочерних потока ("вытекающие" из мейн потока). Цель такова:

1 поток должен заносить значения в карту (QMap),
2 поток должен эти значения cчитывать.

То есть, осуществляется общение (если концепция этого слова мне ясна) между потоками.

Подскажите пожалуйста, есть ли QMap потокобезопасным, и как привязать эти потоки к общему(глобальному) экземпляру QMap чтобы достигнуть поставленной цели.

2-ое:
Так же буду благодарен, если кто-нибудь предоставит мне не большой пример, по работе с одной общей переменой (к примеру с int'ом) из двух потоков - 1 поток пишет значение, 2-ой - читает его. Я так понимаю - здесь необходимо задействовать мютекс.

Всё что я знаю, так это то, что переменная не может иметь спецификатор static, по скольку это не безопасно (но я не понимаю почему).

UDP: Как вести общение между потоками посредством сигнал/слот я понимаю(по крайней мере мне так кажется :) ), за исключением того что я не знаю, можно ли при этом миновать главный поток, в котором ведется привязка сигнала к слоту разных потоков.

Какие еще существуют средства обмена данными между потоками в QT, если не брать во внимание наличие механизма сигнал/слот?



Объясните пожалуйста кому не сложно. Читал кучу инфы, перелопатил много гугла, но везде только примитивные малоинформативные примеры и практически никакого объяснения. Заранее благодарен :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
ssoft
  опции профиля:
сообщение 1.11.2011, 16:45
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 17.2.2010
Из: Москва
Пользователь №: 1470

Спасибо сказали: 30 раз(а)




Репутация:   3  


Цитата(AXELman4ever @ 1.11.2011, 14:33) *
"Метод объекта главного потока будет вызываться напрямую из дочернего потока", а выполняться он будет там же (в дочернем), или он оттуда будет только вызываться, а выполняться будет через очередь?


И выполняться он будет, там же, в дочернем потоке.
Где методы вызываются, там они и выполняются.

Очереди сообщений и реализованный через них механизм сигнал-слот взаимодействия - это все проделки Qt.

Цитата(AXELman4ever @ 1.11.2011, 14:33) *
А ведь сигнал принадлежит объекту, который в свою очередь принадлежит главному потоку


Сигналы и слоты - это обычные методы классов С++.
В С++ объекты не принадлежат никаким потокам.
Сопоставление QObject конкретному потоку реализовано непосредственно внутри Qt, но перехватывать вызов методов и перенаправлять их в очередь сообщений Qt не умеет.
Поэтому в каком потоке вызываем метод - в таком и выполняем (хоть сигнал, хоть слот, хоть обычный метод).

Цитата(AXELman4ever @ 1.11.2011, 14:33) *
А в чем заключается опасность?

Опасность в одновременном не синхронизированном доступе к данным из разных потоков, и как следствие возможном нарушения их целостности и крешу программы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- AXELman4ever   QMap + QThread   27.10.2011, 12:21
- - wiz29   1. QMap не потокобезопасен. Делай класс обертку дл...   27.10.2011, 14:28
|- - AXELman4ever   Цитата(wiz29 @ 27.10.2011, 14:28) 1. QMap...   27.10.2011, 15:20
|- - AXELman4ever   Цитата(AXELman4ever @ 27.10.2011, 15:20) ...   27.10.2011, 16:04
- - ssoft   Например, что-то такое template< typename _Ke...   27.10.2011, 17:40
|- - AXELman4ever   Цитата(ssoft @ 27.10.2011, 17:40) Наприме...   27.10.2011, 18:55
|- - ssoft   Цитата(AXELman4ever @ 27.10.2011, 19:55) ...   28.10.2011, 8:13
|- - AXELman4ever   Цитата(ssoft @ 28.10.2011, 8:13) PS. Жмем...   28.10.2011, 9:42
|- - AXELman4ever   А у меня еще вопрос: Если не залочить insert() ме...   30.10.2011, 6:31
|- - ssoft   Цитата(AXELman4ever @ 30.10.2011, 7:31) А...   31.10.2011, 7:46
|- - AXELman4ever   Цитата(ssoft @ 31.10.2011, 7:46) Если обр...   31.10.2011, 13:47
- - ssoft   Цитата(AXELman4ever @ 31.10.2011, 14:47) ...   31.10.2011, 13:53
|- - AXELman4ever   1: Уточню: QMap принадлежит только главному пото...   31.10.2011, 19:11
- - ssoft   В такой реализации скрыта серьезная ошибка. Правда...   1.11.2011, 8:46
- - AXELman4ever   Премного благодарен за толковое разъяснение. 1. ...   1.11.2011, 13:33
- - ssoft   Цитата(AXELman4ever @ 1.11.2011, 14:33) ...   1.11.2011, 16:45
- - AXELman4ever   ЦитатаОпасность в одновременном не синхронизирован...   1.11.2011, 18:23
- - ssoft   Начиналось все с того, что Цитата(AXELman4ever ...   2.11.2011, 17:17
- - AXELman4ever   Замечательно, вижу свет в конце тоннеля За что, ...   2.11.2011, 23:13
- - ssoft   Цитата(AXELman4ever @ 3.11.2011, 0:13) То...   3.11.2011, 7:45
- - AXELman4ever   Цитата(ssoft @ 3.11.2011, 7:45) Например,...   3.11.2011, 11:28


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.4.2024, 19:48