crossplatform.ru

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

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> 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  


Цитата(wiz29 @ 27.10.2011, 14:28) *
1. QMap не потокобезопасен. Делай класс обертку для QMap, которая будет потокобезопасной.



В моем понимании, я должен написать класс одним из полей которого будет нужный мне QMap и вывести методы работы с этим QMap + потоко-обезопасить их? :mellow:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AXELman4ever
  опции профиля:
сообщение 27.10.2011, 16:04
Сообщение #4


Студент
*

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

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




Репутация:   0  


Цитата(AXELman4ever @ 27.10.2011, 15:20) *
Цитата(wiz29 @ 27.10.2011, 14:28) *
1. QMap не потокобезопасен. Делай класс обертку для QMap, которая будет потокобезопасной.



В моем понимании, я должен написать класс одним из полей которого будет нужный мне QMap и вывести методы работы с этим QMap + потоко-обезопасить их? :mellow:


Смахивает на синглтон. Но интересуют так же и другие возможные методы.

Сообщение отредактировал AXELman4ever - 27.10.2011, 16:10
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 27.10.2011, 17:40
Сообщение #5


Участник
**

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

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




Репутация:   3  


Например, что-то такое

template< typename _Key, typename _Value >
class MySafeMap
{
    QMutex m_mutex;
    QMap< _Key, _Value > m_map;

public:
    void insert ( const _Key & key, const _Value & value )
    {
        QMutexLocker locker( &m_mutex );
        m_map.insert( key, value );
    }

    _Value value ( const _Key & key ) const
    {
        QMutexLocker locker( &m_mutex );
        m_map.insert( key, value );
    }

    // и т.д. все небходимые методы
}


или

template< typename _Key, typename _Value >
class MySafeMap
{
    QReadWriteLock m_mutex;
    QMap< _Key, _Value > m_map;

public:
    void insert ( const _Key & key, const _Value & value )
    {
        QWriteLocker locker( &m_mutex );
        m_map.insert( key, value );
    }

    _Value value ( const _Key & key ) const
    {
        QReadLocker locker( &m_mutex );
        m_map.insert( key, value );
    }

    // и т.д. все небходимые методы
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AXELman4ever
  опции профиля:
сообщение 27.10.2011, 18:55
Сообщение #6


Студент
*

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

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




Репутация:   0  


Цитата(ssoft @ 27.10.2011, 17:40) *
Например, что-то такое

.....


О, ну это уже по-интереснее :)

А почему я не могу залочить мютекс непосредственно перед вставкой элемента, при этом не создавая обертку?

Ну к примеру :
QMap <int, QString> myMap;
....

mutex.lock();
myMap.insert( 1, "The One" );
mutex.unlock();


Разве не тоже самое? Просто за безопасностью придется следить самостоятельно.


UDP: Возьму на Вашем примере, создам экземпляр класса-обертки. Теперь стоит вопрос в том как использовать этот экземпляр между потоками? Внедрить его как поле в класс-синглтон и оперировать им из потоков через указатели?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 28.10.2011, 8:13
Сообщение #7


Участник
**

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

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




Репутация:   3  


Цитата(AXELman4ever @ 27.10.2011, 19:55) *
А почему я не могу залочить мютекс непосредственно перед вставкой элемента, при этом не создавая обертку?
Разве не тоже самое? Просто за безопасностью придется следить самостоятельно.


Почти тоже самое, просто обертка автоматически разлочит мьютекс при любой причине выхода из пространства её видимости,
даже при исключениях. А здесь нужно самому помнить об этом, а исключение оставит мьютекс заблокированным.

Цитата(AXELman4ever @ 27.10.2011, 19:55) *
UDP: Возьму на Вашем примере, создам экземпляр класса-обертки. Теперь стоит вопрос в том как использовать этот экземпляр между потоками? Внедрить его как поле в класс-синглтон и оперировать им из потоков через указатели?


Можно и синглтоном, а лучще через умный указатель QSharedPointer.

PS. Жмем кнопку спасибо :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AXELman4ever
  опции профиля:
сообщение 28.10.2011, 9:42
Сообщение #8


Студент
*

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

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




Репутация:   0  


Цитата(ssoft @ 28.10.2011, 8:13) *
PS. Жмем кнопку спасибо :rolleyes:


А как же ;) Всем большое при-большое спасибо :lol:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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  


Цитата(AXELman4ever @ 30.10.2011, 7:31) *
А у меня еще вопрос:

Если не залочить insert() метод у QMap и в какой-то момент, к этому методу обратится 2 потока чтобы внести новые значения, что произойдет в данном случае?

Каждый поток скопирует себе объект QMap и выполнит над ним действие, или же процедура будет другой?



Может кто-нибудь описать процедуру изменения объекта потоком. Спасибо.


Если обращаться к объекту QMap через указатель ( QMap * object ) или ссылку ( QMap & object ), тогда для потоков QMap будет одним и тем же и одновременный доступ к методам ведет к не предсказуемым результатам, чаще всего к крешу.

Если обращаться к объекту через его копию ( QMap object ), тогда у каждого потока будет свой собственный экземпляр данных никак не связанных с данными другого потока. Креша не будет, но данные будут разные.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 19.4.2024, 8:05