Прошу прощения за некропост, но вот какие у меня наблюдения появились по поводу ацких связок 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-шный сигнал другим объектам. Забиндил обработчик через буст в либу. Пару недель работало нормально. Потом надо было добавить функционал, когда либа прекращает работу (в каллбэке есть специальные параметры). Стало вылетать.
В общем пришлось исключить обработчик из класса, и отказаться от бустового бинда, передавая напрямую каллбэчную ф-ю, в которой вызывать метод класса, и из последнего эмитить сигнал.
Псевдокод тут приводить не буду, ибо много очень.