QMap + QThread |
Здравствуйте, гость ( Вход | Регистрация )
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 |
31.10.2011, 13:53
Сообщение
#2
|
Участник Группа: Участник Сообщений: 130 Регистрация: 17.2.2010 Из: Москва Пользователь №: 1470 Спасибо сказали: 30 раз(а) Репутация: 3 |
Так, понял. Но это в случае если метод, в котором осуществляется доступ к QMap будет выполнен в разных потоках. А вот когда оба потока вызовут метод на выполнение в главном потоке, а не каждый в своем, то ведь как не крути - очередь у главного потока одна, и все запросы на изменение объекта QMap буду выполнятся по-очередно, ведь так? Нет, не так. Вызов методов QMap прямой и синхронный и каждый в своем потоке, а не через очередь сообщений. оба потока вызовут метод на выполнение в главном потоке, а не каждый в своем А это как возможно? Если только главный поток содержит некий диспетчер для QMap.)) К примеру, 2 потока отправляют сигнал с параметрами на слот главного потока. Тогда QMap не является общими данными для разных потоков, а является данными для главного потока. Смотря как нужно для реализации. Пусть изменения можно внести и так, а как быть с получением данных от QMap??? Или данные QMap в разных потоках не нужны, тогда зачем вообще городить огород с потоками, когда можно все реализовать в главном потоке??? Сообщение отредактировал ssoft - 31.10.2011, 14:01 |
|
|
AXELman4ever |
31.10.2011, 19:11
Сообщение
#3
|
Студент Группа: Участник Сообщений: 31 Регистрация: 22.9.2011 Пользователь №: 2902 Спасибо сказали: 0 раз(а) Репутация: 0 |
1:
Уточню: QMap принадлежит только главному потоку... QMap, не является общим для потоков и только главный поток читает данные из него. Но существует дочерний поток, который хочет записать в него данные, потому испускает сигнал с параметрами на слот главного потока где и происходит insert в QMap. Хочу привести начальный пример. Я покаместь опущу использование Q(Multi)Map, по скольку понимаю что проблема заключается в непонимании принципа вызова методов из потока. Очень прошу Вас немного помучаться со мной Существует слот в главном потоке:
существует 1 дочерний поток в котором run() описан следующим образом:
в главном треде инициализирован дочерний поток и описан коннект для него:
Так вот, если в коннекте указать Qt::DirectConnection то согласно QThread::currentThread() выполнение метода произойдет в дочернем потоке, а при Qt::QueuedConnection - в главном. Разве не так? И вот как я понимаю это, есть доступ прямой - когда много потоков вызывают 1 метод не принадлежащий ему, и этот метод выполняет главный поток, и синхронный - когда выполнение метода переносится в другие потоки которые выполняют его синхронно по отношению друг к другу. 2: Задача подразумевает что: QMap принадлежит только(одному) главному потоку, и существует еще 10 потоков, которые дергают метод главного потока сигналом с параметрами. То есть главный поток все время получает параметры на слот и вкладывает их в QMap. Так вот, вопрос в следующем: Вызов методов QMap в ситуации как я описал ранее, в 1 пункте этого поста - в любом случае будет принадлежать чужому потоку?Независимо от того стоит там Qt::DirectConnection или же Qt::DirectConnection, всеравно метод insert для QMap выполнится в чужом потоке? UDP: Я прошу прощения, не ругайте сильно за чушь, если где была такая. Все мы были такими, все чего-то не знали или не понимали. Просто хотелось бы понять что к чему в подробностях, а не по принципу "ну раз работает - значит так надо" Спасибо. Сообщение отредактировал AXELman4ever - 31.10.2011, 20:58 |
|
|
Текстовая версия | Сейчас: 22.11.2024, 20:14 |