Приветствую!
И так ситуация в следующем: Есть некий клиент, который живет и работает в своих потоках
У этого клиента есть свои события, которые приходят, опять же, в его потоках.
Делаю для него обертку, которую потом использую в QML. Разумеется, событие выворачиваю в сигнал. Код *.h:
C++ (Qt)
void fileEvent( unsigned error, QByteArray data ) const;
в cpp я регистрируюсь на событие клиента и делаю emit этому сигналу. Код:
C++ (Qt)
......
event_cb_ = std::bind( &impl::events_handler, this, /// handler function
std::placeholders::_1,
std::placeholders::_2 );
......
iface_->register_for_events( event_cb_ ); /// register
.....
void events_handler( unsigned error, const std::string &data )
{
emit fileEvent( error, QByteArray( data.c_str( ), data.size( ) ) );
}
....
А теперь проблема. Первое событие приходит и обрабатывается нормально (получаю текст в лейблочке). Cкорее всего, потому как генерируется сразу при вызове register_for_events, который вызван из нажатия кнопки. А вот следующее событие приводит к сегфолту вот в этом месте:
C++ (Qt)
void fr::declarative::FrClientFile::fileEvent(unsigned _t1, QByteArray _t2)const
{
void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)), const_cast<void*>(reinterpret_cast<const void*>(&_t2)) };
QMetaObject::activate(const_cast< fr::declarative::FrClientFile *>(this), &staticMetaObject, 4, _a); /// <-- here we are!
}
И далее по стеку при размотке метаобъека, глубоко в либе.
Это нагенеряченый файл moc_.... того самого hшника, в котором описан сигнал.
Судя по дебагеру, все объекты живые, указатели указывают, в метаобъектах тоже не нашел мусора, куда рука дотянулась.
Собссно вопрос: я чего-то не понимаю? емит сигнала может быть произведен только из потоков Qt? И чего вдруг сегфолт в дебрях либы? Сталкивался кто с таким?
И еще. В сигналы можно скармливать объекты по константным ссылкам? или лучше по значениям? ну так, а то мало ли...
Спасибо.
ЗЫЖ в теге code не отображается кириллица.