Russian Qt Forum
Ноябрь 24, 2024, 09:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: boost::thread / boost::bind + классы Qt  (Прочитано 3537 раз)
RedDog
Гость
« : Май 30, 2013, 13:26 »

Интересует совместимость означенных сабжей. Какие подводные течения могут преследовать, при многопоточности от буста, если в нее Qt класс передать, как bind отработает вместе с моком? И т.д. и т.п. В общем буду рад выслушать мнения тех кто работал и глубоко разбирался в сабже.
Записан
thechicho
Гость
« Ответ #1 : Май 30, 2013, 13:59 »

а чем вас QThread не устраивает?
Записан
RedDog
Гость
« Ответ #2 : Май 30, 2013, 14:01 »

а чем вас QThread не устраивает?
А где я такое сказал?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Май 30, 2013, 14:42 »

Интересует совместимость означенных сабжей. Какие подводные течения могут преследовать, при многопоточности от буста, если в нее Qt класс передать, как bind отработает вместе с моком? И т.д. и т.п. В общем буду рад выслушать мнения тех кто работал и глубоко разбирался в сабже.
Да все должно работать. Я сам не совмещал, но не вижу причин почему это не должно работать.
Ограничения те же: не дергать GUI из других ниток.
Скорее всего заработают даже очереди событий QEventLoop.
connect не сможет определять что получатель находиться в другом потоке и назначать тип передачи сигнлала через очередь, но это фигня.
Записан
RedDog
Гость
« Ответ #4 : Июнь 27, 2014, 14:58 »

Прошу прощения за некропост, но вот какие у меня наблюдения появились по поводу ацких связок Qt+boost+говнокод. Возможно это кому то поможет.
Ситуация 1:
некий цикл типа while(true), В нем создается свой класс с QTcpSocket. Последний в таком говнокоде не хочет работать асинхронно. Пришлось создавать отдельный тред для асинхонной работы сокета.
Псевдокод:
Нерабочий вариант:
Код:
while( true )
{
   if( bla_bla)
   {
       CTcpConnection * connection = new CTcpConnection( bla_bla_IP_address );
       connection->Connect();
   }
}

Рабочий:
Код:
while( true )
{
   if( bla_bla)
   {
       CTcpConnection * connection = new CTcpConnection( bla_bla_IP_address );
       connection->MoveToThread();
       connection->Connect();
   }
}

Ситуация 2: есть сторонняя либа, которой надо указать свой обработчик (каллбэк-функцию). Этот обработчик внутри либы живет в своем каком то отдельном потоке.
Сделал его методом класса, в обработчике высылаю Qt-шный сигнал другим объектам. Забиндил обработчик через буст в либу. Пару недель работало нормально. Потом надо было добавить функционал, когда либа прекращает работу (в каллбэке есть специальные параметры). Стало вылетать.
В общем пришлось исключить обработчик из класса, и отказаться от бустового бинда, передавая напрямую каллбэчную ф-ю, в которой вызывать метод класса, и из последнего эмитить сигнал.
Псевдокод тут приводить не буду, ибо много очень.
Записан
OKTA
Гость
« Ответ #5 : Июнь 27, 2014, 19:39 »

Надеюсь, while(true) никому не поможет  Смеющийся Смеющийся Смеющийся Смеющийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 23.