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, если не брать во внимание наличие механизма сигнал/слот? Объясните пожалуйста кому не сложно. Читал кучу инфы, перелопатил много гугла, но везде только примитивные малоинформативные примеры и практически никакого объяснения. Заранее благодарен |
|
|
AXELman4ever |
1.11.2011, 13:33
Сообщение
#2
|
Студент Группа: Участник Сообщений: 31 Регистрация: 22.9.2011 Пользователь №: 2902 Спасибо сказали: 0 раз(а) Репутация: 0 |
Премного благодарен за толковое разъяснение.
1. Что касается замечаний, то пример был состряпан за 5 минут, без какой-либо нужды корректно (или вообще) завершать потоки, потому триггер, регулирующий правильное его завершение я не использовал, но с данным методом я знаком. 2. Тоже самое могу сказать и про отсутствие указателя на родителя в объекте-наследнике QThread, по причине что я не задавался целью удалять объект в процессе работы программы, он ведь сам удалится по её завершению. К тому же, можно исправить ситуацию через delete, ему ведь все равно, есть у объекта родитель или его нет. Спасибо, очень достойное замечание, уверен что я бы сделал ошибку будь у меня иной пример. По 3 замечанию всё понятно Но появилось еще несколько неясностей: Цитата Сигнал
в данном случае опасен, т.к. он принадлежит объекту из главного потока, а вызывается в дочернем. Так именно это мне и требуется. А в чем заключается опасность? Цитата ... Qt::AutoConnection == Qt::DirectConnection и метод объекта главного потока будет вызываться напрямую из дочернего потока. "Метод объекта главного потока будет вызываться напрямую из дочернего потока", а выполняться он будет там же (в дочернем), или он оттуда будет только вызываться, а выполняться будет через очередь? Цитата Прямой вызов - это непосредственный вызов слота, как-будто бы метод вызывается явно. Поэтому где он вызван, в том потоке он и выполняется. А где он вызван? Там, откуда испускается сигнал? А ведь сигнал принадлежит объекту, который в свою очередь принадлежит главному потоку, и согласно выше сказанному, сигнал уже не имеет отношения к дочернему потоку, а может только испускаться из него - это никак не влияет на то, где выполнится метод? Блин, чем глубже я копаю, тем больше сомневаюсь в том, что я хоть что-то понимал Сообщение отредактировал AXELman4ever - 1.11.2011, 14:49 |
|
|
Текстовая версия | Сейчас: 22.11.2024, 14:10 |