crossplatform.ru

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

> 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
  опции профиля:
сообщение 27.10.2011, 17:40
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 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
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 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
Сообщение #4


Участник
**

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

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




Репутация:   3  


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


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

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


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

PS. Жмем кнопку спасибо :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- AXELman4ever   QMap + QThread   27.10.2011, 12:21
- - wiz29   1. QMap не потокобезопасен. Делай класс обертку дл...   27.10.2011, 14:28
|- - AXELman4ever   Цитата(wiz29 @ 27.10.2011, 14:28) 1. QMap...   27.10.2011, 15:20
|- - AXELman4ever   Цитата(AXELman4ever @ 27.10.2011, 15:20) ...   27.10.2011, 16:04
- - ssoft   Например, что-то такое template< typename _Ke...   27.10.2011, 17:40
|- - AXELman4ever   Цитата(ssoft @ 27.10.2011, 17:40) Наприме...   27.10.2011, 18:55
|- - ssoft   Цитата(AXELman4ever @ 27.10.2011, 19:55) ...   28.10.2011, 8:13
|- - AXELman4ever   Цитата(ssoft @ 28.10.2011, 8:13) PS. Жмем...   28.10.2011, 9:42
|- - AXELman4ever   А у меня еще вопрос: Если не залочить insert() ме...   30.10.2011, 6:31
|- - ssoft   Цитата(AXELman4ever @ 30.10.2011, 7:31) А...   31.10.2011, 7:46
|- - AXELman4ever   Цитата(ssoft @ 31.10.2011, 7:46) Если обр...   31.10.2011, 13:47
- - ssoft   Цитата(AXELman4ever @ 31.10.2011, 14:47) ...   31.10.2011, 13:53
|- - AXELman4ever   1: Уточню: QMap принадлежит только главному пото...   31.10.2011, 19:11
- - ssoft   В такой реализации скрыта серьезная ошибка. Правда...   1.11.2011, 8:46
- - AXELman4ever   Премного благодарен за толковое разъяснение. 1. ...   1.11.2011, 13:33
- - ssoft   Цитата(AXELman4ever @ 1.11.2011, 14:33) ...   1.11.2011, 16:45
- - AXELman4ever   ЦитатаОпасность в одновременном не синхронизирован...   1.11.2011, 18:23
- - ssoft   Начиналось все с того, что Цитата(AXELman4ever ...   2.11.2011, 17:17
- - AXELman4ever   Замечательно, вижу свет в конце тоннеля За что, ...   2.11.2011, 23:13
- - ssoft   Цитата(AXELman4ever @ 3.11.2011, 0:13) То...   3.11.2011, 7:45
- - AXELman4ever   Цитата(ssoft @ 3.11.2011, 7:45) Например,...   3.11.2011, 11:28


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


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




RSS Текстовая версия Сейчас: 22.11.2024, 19:39