Russian Qt Forum

Qt => Общие вопросы => Тема начата: RedDog от Май 30, 2013, 13:26



Название: boost::thread / boost::bind + классы Qt
Отправлено: RedDog от Май 30, 2013, 13:26
Интересует совместимость означенных сабжей. Какие подводные течения могут преследовать, при многопоточности от буста, если в нее Qt класс передать, как bind отработает вместе с моком? И т.д. и т.п. В общем буду рад выслушать мнения тех кто работал и глубоко разбирался в сабже.


Название: Re: boost::thread / boost::bind + классы Qt
Отправлено: thechicho от Май 30, 2013, 13:59
а чем вас QThread не устраивает?


Название: Re: boost::thread / boost::bind + классы Qt
Отправлено: RedDog от Май 30, 2013, 14:01
а чем вас QThread не устраивает?
А где я такое сказал?


Название: Re: boost::thread / boost::bind + классы Qt
Отправлено: Old от Май 30, 2013, 14:42
Интересует совместимость означенных сабжей. Какие подводные течения могут преследовать, при многопоточности от буста, если в нее Qt класс передать, как bind отработает вместе с моком? И т.д. и т.п. В общем буду рад выслушать мнения тех кто работал и глубоко разбирался в сабже.
Да все должно работать. Я сам не совмещал, но не вижу причин почему это не должно работать.
Ограничения те же: не дергать GUI из других ниток.
Скорее всего заработают даже очереди событий QEventLoop.
connect не сможет определять что получатель находиться в другом потоке и назначать тип передачи сигнлала через очередь, но это фигня.


Название: Re: boost::thread / boost::bind + классы Qt
Отправлено: RedDog от Июнь 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-шный сигнал другим объектам. Забиндил обработчик через буст в либу. Пару недель работало нормально. Потом надо было добавить функционал, когда либа прекращает работу (в каллбэке есть специальные параметры). Стало вылетать.
В общем пришлось исключить обработчик из класса, и отказаться от бустового бинда, передавая напрямую каллбэчную ф-ю, в которой вызывать метод класса, и из последнего эмитить сигнал.
Псевдокод тут приводить не буду, ибо много очень.


Название: Re: boost::thread / boost::bind + классы Qt
Отправлено: OKTA от Июнь 27, 2014, 19:39
Надеюсь, while(true) никому не поможет  ;D ;D ;D ;D