суббота, 10 марта 2012 г.

QTcpSocket и QThread в одном флаконе, что надо сделать и чего не надо

Маленькая предыстория. Написали мы совтинку под Meego 1.2 Harmattan, и решили портировать её под Symbian. Немножко повозились с интерфейсом (повозился я, ибо я его и писал), вроде всё запускалось. Потом стало необходимо прилепить логику, но не тут то было. Стало появляется куча магических ошибок, среди них:
1. Зависание при попытке записи данных в сокет.
2. Поток завершился крахом: Thread 0xba2 has panicked. Category: QEventDispatcher; Reason: 0
Были ещё какие-то, но их я не сохранил. 
Ах, да, в эмуляторе была ещё одна ошибка: QSocketNotifier: socket notifiers cannot be enabled from another thread
Так как логику писал не я, а исправлять пришлось мне (ну вот так плохо получилось), я очень долго рыл всю эту штуку...



А на выходе всё оказалось скучно и неинтересно.
Все создаваемые объекты (и сам поток в том числе) вам необходимо перенести методом MoveToThreat(QThread *thread).


Вот пример из моего кода:



    mTransport = new CTransport();
    connect(this,SIGNAL(PostToTransport(QByteArray)),mTransport,SLOT(Post(QByteArray)));
    mTransport->moveToThread(mTransport);



А вот так я создавал сокет в методе run():

    mSocket = new QTcpSocket();
    mSocket->moveToThread(this);




1 комментарий: