![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
AXELman4ever |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 31 Регистрация: 22.9.2011 Пользователь №: 2902 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Добрый день!
Уважаемые, не пинайте сильно если подобные темы уже возникали (в поиске не натыкался). В первую очередь признаюсь - каких либо глубоких познаний в потоках не имею, но работаю над этим. Посему хочу просить помощь в просвещении того как ораганизовать подобную связку. 1-ое: Имеется 2 дочерних потока ("вытекающие" из мейн потока). Цель такова: 1 поток должен заносить значения в карту (QMap), 2 поток должен эти значения cчитывать. То есть, осуществляется общение (если концепция этого слова мне ясна) между потоками. Подскажите пожалуйста, есть ли QMap потокобезопасным, и как привязать эти потоки к общему(глобальному) экземпляру QMap чтобы достигнуть поставленной цели. 2-ое: Так же буду благодарен, если кто-нибудь предоставит мне не большой пример, по работе с одной общей переменой (к примеру с int'ом) из двух потоков - 1 поток пишет значение, 2-ой - читает его. Я так понимаю - здесь необходимо задействовать мютекс. Всё что я знаю, так это то, что переменная не может иметь спецификатор static, по скольку это не безопасно (но я не понимаю почему). UDP: Как вести общение между потоками посредством сигнал/слот я понимаю(по крайней мере мне так кажется ![]() Какие еще существуют средства обмена данными между потоками в QT, если не брать во внимание наличие механизма сигнал/слот? Объясните пожалуйста кому не сложно. Читал кучу инфы, перелопатил много гугла, но везде только примитивные малоинформативные примеры и практически никакого объяснения. Заранее благодарен ![]() |
|
|
![]() |
ssoft |
![]()
Сообщение
#2
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 130 Регистрация: 17.2.2010 Из: Москва Пользователь №: 1470 Спасибо сказали: 30 раз(а) Репутация: ![]() ![]() ![]() |
В такой реализации скрыта серьезная ошибка.
Правда ее допускают вначале практически 95% программистов. Объясняю: Объект QThread - это класс "обертка" вокруг реального потока. Как и любой объект QObject он принадлежит тому потоку, в котором он создан, в данном случае главному потоку. Сигнал
в данном случае опасен, т.к. он принадлежит объекту из главного потока, а вызывается в дочернем. Поэтому здесь Qt::AutoConnection == Qt::DirectConnection и метод объекта главного потока будет вызываться напрямую из дочернего потока. Если написать явно Qt::QueuedConnection, то проблем быть не должно, тюк. метод будет вызываться через очередь. Цитата И вот как я понимаю это, есть доступ прямой - когда много потоков вызывают 1 метод не принадлежащий ему, и этот метод выполняет главный поток, и синхронный - когда выполнение метода переносится в другие потоки которые выполняют его синхронно по отношению друг к другу. Методы не принадлежат потокам). Прямой вызов - это непосредственный вызов слота, как-будто бы метод вызывается явно. Поэтому где он вызван, в том потоке он и выполняется. Разные потоки всегда работают асинхронно, для их синхронизации и используются всякие приблуды типа мьютексов и семафоров. Сделаю еще несколько замечаний: 1. Так писать не нужно, т.к. поток никогда корректно не завершиться.
Нужно либо так
Либо так
2. В инициализации дочернего потока
не указан родитель, т.о. thread никогда не удалиться (будут лики памяти) Можно записать так
3. Здесь очередь не запускается
Очередь запускается только методом exec(). Сообщение отредактировал ssoft - 1.11.2011, 8:48 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 6.5.2025, 13:43 |