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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [решено] Сигнал из НЕ Qt потока. Лыжи не едут?  (Прочитано 3636 раз)
nwnclv
Гость
« : Декабрь 02, 2014, 23:47 »

Приветствую!

И так ситуация в следующем: Есть некий клиент, который живет и работает в своих потоках
У этого клиента есть свои события, которые приходят, опять же, в его потоках.

Делаю для него обертку, которую потом использую в 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 не отображается кириллица.
« Последнее редактирование: Декабрь 05, 2014, 19:57 от nwnclv » Записан
Bepec
Гость
« Ответ #1 : Декабрь 03, 2014, 10:11 »

Посмотрите в moc файле, нет ли там в инклудах строк типо
#error *************
Если есть приведите Улыбающийся
Записан
nwnclv
Гость
« Ответ #2 : Декабрь 03, 2014, 20:19 »

Из всех только такое есть
Код
C++ (Qt)
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'fr-client-file.h' doesn't include <QObject>."
#elif Q_MOC_OUTPUT_REVISION != 67
#error "This file was generated using the moc from 5.2.1. It"
#error "cannot be used with the include files from this version of Qt."
#error "(The moc has changed too much.)"
#endif
 

и то неактивны. Да и не собралось бы оно :-/ Кстати у меня класс является наследником от базового класса, который является наследником от QObject. Но в этом, на сколь понимаю, проблем не должно быть...
Записан
nwnclv
Гость
« Ответ #3 : Декабрь 05, 2014, 19:56 »

Отбой тревоги. В сусе у меня кривая сборка либы. В Ubuntu вроде все норм =)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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