Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -------- in mqmessagemanager.cpp --------------------------
- // This is the static wrapper for the class
- // The class comes from a gpointer (void*) data
- // And it's converted to a class pointer.
- // Then we just simply call a method.
- // Since the call back comes from glib is a plain pthread thread.
- static gboolean callbackWrapper(SG64ZeroMQ* mq, ThriftStruct* message, gpointer data, GError **error) {
- qDebug("Message received");
- MQMessageManager* self = static_cast<MQMessageManager*>(data);
- fflush(stdout);
- return self->processMessage(mq, message, error);
- }
- // Other method of the class
- bool MQMessageManager::processMessage(SG64ZeroMQ* mq, ThriftStruct* message, GError **error)
- {
- mqPayload *payload=NULL;
- mqCardEvent *cardEvent = NULL;
- mqMessage *msg=NULL;
- QString str;
- g_return_val_if_fail (THRIFT_IS_STRUCT (message), FALSE);
- // if(QThread::self()==NULL){
- // qDebug("Not in thread");
- // }
- if(IS_MQ_MESSAGE(message))
- msg=MQ_MESSAGE(message);
- switch(msg->type){
- case MQ_MESSAGE_TYPE_COMMAND:
- puts("Received a command");
- break;
- case MQ_MESSAGE_TYPE_GPS_EVENT:
- puts("Received a gps event");
- break;
- case MQ_MESSAGE_TYPE_CARD_EVENT:
- if(IS_MQ_CARD_EVENT(msg->payload->card_event)){
- cardEvent = msg->payload->card_event;
- if(cardEvent!=NULL && cardEvent->atr!=NULL){
- QByteArray array((char *)cardEvent->atr->data, (int) cardEvent->atr->len);
- QString atr = QString(array.toHex());
- qDebug("ATR found of size %d, %s", cardEvent->atr->len, atr.toLatin1().data());
- // emit valid(atr);
- emit cardValidationSuccess(); // It breaks here!!!!!!!!!!!!!
- qDebug("Emitted valid signal");
- QThread *thread = QThread::currentThread();
- qDebug("Emitted valid signal %x", thread);
- // thread->
- // QMetaObject::invokeMethod(this, "valid", Qt::QueuedConnection,
- // Q_ARG(QString, atr));
- }
- }
- break;
- default:
- printf("Message of type %i cannot be managed\n", msg->type);
- break;
- }
- return TRUE;
- }
- -------- in mqmessagemanager.cpp --------------------------
- -------- in mainwindow.cpp --------------------------
- // I just connect few signals
- // Can even move (by comments) the class to a new thread
- // but it makes no difference on the bug. It breaks the same
- void MainWindow::startManagement()
- {
- ui->textLabel->show();
- qDebug("Starting management");
- // QThread *rfidThread = new QThread(this);
- // QObject::connect(rfidThread, SIGNAL(started()), nfcReader, SLOT(startrfid()));
- if(!QObject::connect(mqMessageManager, SIGNAL(cardValidationSuccess()), this, SLOT(displayValid()),Qt::QueuedConnection)){
- qDebug("Cannot connect signal");
- }
- QObject::connect(mqMessageManager, SIGNAL(valid(QString)), this, SLOT(displayValid(QString)), Qt::BlockingQueuedConnection);
- // QObject::connect(mqMessageManager, SIGNAL(invalid(QString)), this, SLOT(displayInvalid(QString)), Qt::BlockingQueuedConnection);
- // QObject::connect(mqMessageManager, SIGNAL(concession(QString)), this, SLOT(displayConcession(QString)), Qt::BlockingQueuedConnection);
- // mqMessageManager->moveToThread(rfidThread);
- // rfidThread->start( );
- QTimer::singleShot(0, mqMessageManager, SIGNAL(startMQMessenging()));
- }
- void MainWindow::displayValid()
- {
- green_light();
- QPixmap pixmap(qApp->applicationDirPath()+"/images/valid.png");
- ui->imageLabel->setPixmap(pixmap);
- ui->imageLabel->setMask(pixmap.mask());
- ui->textLabel->setText(message);
- ui->textLabel->show();
- play_good();
- timer.start(SCREENTIME);
- }
- -------- in mainwindow.cpp --------------------------
- -------------------------------------------------------
- -- If I add this it does not break
- -------------------------------------------------------
- class mqmessagebridge: public QObject {
- Q_OBJECT
- MQMessageManager *manager;
- QThread *thread;
- public:
- mqmessagebridge(MQMessageManager* mq_, QThread *_currThread) : manager(mq_), thread(_currThread) {}
- public slots:
- void processMessage(SG64ZeroMQ* mq, ThriftStruct* message, GError **error) {
- qDebug("Thread of the bridge %x", QThread::currentThread()); // Thread of the bridge c00024f0
- qDebug("Thread of the stored class in bridge %x", thread); // Thread of the stored class in bridge d400eb80
- // manager->moveToThread(QThread::currentThread()); // QObject::moveToThread: Cannot move objects with a parent
- manager->processMessage(mq,message,error);
- }
- };
- -------- in mqmessagemanager.cpp --------------------------
- // This is the static wrapper for the class
- // The class comes from a gpointer (void*) data
- // And it's converted to a class pointer.
- // Then we just simply call a method.
- // Since the call back comes from glib is a plain pthread thread.
- static gboolean callbackWrapper(SG64ZeroMQ* mq, ThriftStruct* message, gpointer data, GError **error) {
- qDebug("Message received");
- mqmessagebridge *self = static_cast<mqmessagebridge*>(data);
- fflush(stdout);
- qDebug("Thread of the call %x", QThread::currentThread());
- self->processMessage(mq, message, error);
- return TRUE;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement