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, если не брать во внимание наличие механизма сигнал/слот? Объясните пожалуйста кому не сложно. Читал кучу инфы, перелопатил много гугла, но везде только примитивные малоинформативные примеры и практически никакого объяснения. Заранее благодарен |
|
|
wiz29 |
27.10.2011, 14:28
Сообщение
#2
|
Старейший участник Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: 12 |
1. QMap не потокобезопасен. Делай класс обертку для QMap, которая будет потокобезопасной.
"Какие еще существуют средства обмена данными между потоками в QT, если не брать во внимание наличие механизма сигнал/слот?" - QEvent, QSharedMemory |
|
|
AXELman4ever |
27.10.2011, 15:20
Сообщение
#3
|
Студент Группа: Участник Сообщений: 31 Регистрация: 22.9.2011 Пользователь №: 2902 Спасибо сказали: 0 раз(а) Репутация: 0 |
|
|
|
AXELman4ever |
27.10.2011, 16:04
Сообщение
#4
|
Студент Группа: Участник Сообщений: 31 Регистрация: 22.9.2011 Пользователь №: 2902 Спасибо сказали: 0 раз(а) Репутация: 0 |
1. QMap не потокобезопасен. Делай класс обертку для QMap, которая будет потокобезопасной. В моем понимании, я должен написать класс одним из полей которого будет нужный мне QMap и вывести методы работы с этим QMap + потоко-обезопасить их? Смахивает на синглтон. Но интересуют так же и другие возможные методы. Сообщение отредактировал AXELman4ever - 27.10.2011, 16:10 |
|
|
ssoft |
27.10.2011, 17:40
Сообщение
#5
|
Участник Группа: Участник Сообщений: 130 Регистрация: 17.2.2010 Из: Москва Пользователь №: 1470 Спасибо сказали: 30 раз(а) Репутация: 3 |
Например, что-то такое
или
|
|
|
AXELman4ever |
27.10.2011, 18:55
Сообщение
#6
|
Студент Группа: Участник Сообщений: 31 Регистрация: 22.9.2011 Пользователь №: 2902 Спасибо сказали: 0 раз(а) Репутация: 0 |
Например, что-то такое ..... О, ну это уже по-интереснее А почему я не могу залочить мютекс непосредственно перед вставкой элемента, при этом не создавая обертку? Ну к примеру :
Разве не тоже самое? Просто за безопасностью придется следить самостоятельно. UDP: Возьму на Вашем примере, создам экземпляр класса-обертки. Теперь стоит вопрос в том как использовать этот экземпляр между потоками? Внедрить его как поле в класс-синглтон и оперировать им из потоков через указатели? |
|
|
ssoft |
28.10.2011, 8:13
Сообщение
#7
|
Участник Группа: Участник Сообщений: 130 Регистрация: 17.2.2010 Из: Москва Пользователь №: 1470 Спасибо сказали: 30 раз(а) Репутация: 3 |
А почему я не могу залочить мютекс непосредственно перед вставкой элемента, при этом не создавая обертку? Разве не тоже самое? Просто за безопасностью придется следить самостоятельно. Почти тоже самое, просто обертка автоматически разлочит мьютекс при любой причине выхода из пространства её видимости, даже при исключениях. А здесь нужно самому помнить об этом, а исключение оставит мьютекс заблокированным. UDP: Возьму на Вашем примере, создам экземпляр класса-обертки. Теперь стоит вопрос в том как использовать этот экземпляр между потоками? Внедрить его как поле в класс-синглтон и оперировать им из потоков через указатели? Можно и синглтоном, а лучще через умный указатель QSharedPointer. PS. Жмем кнопку спасибо |
|
|
AXELman4ever |
28.10.2011, 9:42
Сообщение
#8
|
Студент Группа: Участник Сообщений: 31 Регистрация: 22.9.2011 Пользователь №: 2902 Спасибо сказали: 0 раз(а) Репутация: 0 |
|
|
|
AXELman4ever |
30.10.2011, 6:31
Сообщение
#9
|
Студент Группа: Участник Сообщений: 31 Регистрация: 22.9.2011 Пользователь №: 2902 Спасибо сказали: 0 раз(а) Репутация: 0 |
А у меня еще вопрос:
Если не залочить insert() метод у QMap и в какой-то момент, к этому методу обратится 2 потока чтобы внести новые значения, что произойдет в данном случае? Каждый поток скопирует себе объект QMap и выполнит над ним действие, или же процедура будет другой? Может кто-нибудь описать процедуру изменения объекта потоком. Спасибо. |
|
|
ssoft |
31.10.2011, 7:46
Сообщение
#10
|
Участник Группа: Участник Сообщений: 130 Регистрация: 17.2.2010 Из: Москва Пользователь №: 1470 Спасибо сказали: 30 раз(а) Репутация: 3 |
А у меня еще вопрос: Если не залочить insert() метод у QMap и в какой-то момент, к этому методу обратится 2 потока чтобы внести новые значения, что произойдет в данном случае? Каждый поток скопирует себе объект QMap и выполнит над ним действие, или же процедура будет другой? Может кто-нибудь описать процедуру изменения объекта потоком. Спасибо. Если обращаться к объекту QMap через указатель ( QMap * object ) или ссылку ( QMap & object ), тогда для потоков QMap будет одним и тем же и одновременный доступ к методам ведет к не предсказуемым результатам, чаще всего к крешу. Если обращаться к объекту через его копию ( QMap object ), тогда у каждого потока будет свой собственный экземпляр данных никак не связанных с данными другого потока. Креша не будет, но данные будут разные. |
|
|
Текстовая версия | Сейчас: 22.11.2024, 14:22 |