crossplatform.ru

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

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


Участник
**

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

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




Репутация:   3  


В такой реализации скрыта серьезная ошибка.
Правда ее допускают вначале практически 95% программистов.

Объясняю:

Объект QThread - это класс "обертка" вокруг реального потока.
Как и любой объект QObject он принадлежит тому потоку, в котором он создан, в данном случае главному потоку.

Сигнал

emit tryToDoSmth();


в данном случае опасен, т.к. он принадлежит объекту из главного потока, а вызывается в дочернем.
Поэтому здесь Qt::AutoConnection == Qt::DirectConnection и метод объекта главного потока будет вызываться напрямую из дочернего потока.

Если написать явно Qt::QueuedConnection, то проблем быть не должно, тюк. метод будет вызываться через очередь.

Цитата
И вот как я понимаю это, есть доступ прямой - когда много потоков вызывают 1 метод не принадлежащий ему, и этот метод выполняет главный поток, и синхронный - когда выполнение метода переносится в другие потоки которые выполняют его синхронно по отношению друг к другу.


Методы не принадлежат потокам).

Прямой вызов - это непосредственный вызов слота, как-будто бы метод вызывается явно. Поэтому где он вызван, в том потоке он и выполняется.
Разные потоки всегда работают асинхронно, для их синхронизации и используются всякие приблуды типа мьютексов и семафоров.

Сделаю еще несколько замечаний:

1. Так писать не нужно, т.к. поток никогда корректно не завершиться.

void run()
{
   while(true){
       msleep(150);    
       emit tryToDoSmth();
   }
}


Нужно либо так

void run()
{
   while( not_stoped ){
       msleep(150);    
       emit tryToDoSmth();
   }
}

void setStopFlag ( bool yes )
{
    not_stoped = yes;
}


Либо так

void run()
{
    QTimer notifier; //  notifier принадлежит дочернему потоку, this принадлежит главному
    connect( &timer, SIGNAL( timeout() ), this, SIGNAL( tryToDoSmth() );
    notifier.start( 150 );
    exec();
}


2. В инициализации дочернего потока

MyThread *thread = new MyThread();


не указан родитель, т.о. thread никогда не удалиться (будут лики памяти)
Можно записать так

MyThread *thread = new MyThread( QCoreApplication::instance() );


3. Здесь очередь не запускается

thread->start();        //запускаем очередь потока


Очередь запускается только методом exec().

Сообщение отредактировал ssoft - 1.11.2011, 8:48
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- 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


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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 6.5.2025, 13:43