2016-09-22 2 views
0

я столкнулся со странной проблемой при попытке выполнить следующую программуслот сигнала QT не работает

main.cpp

#include "sample.h" 
#include <QList> 
#include <unistd.h> 

int main(int argc, char **argv) 
{ 
    A a; 
    a.callA(); 
    while(1) 
    sleep(1); 
    return 0; 
} 

sample.cpp

#include "sample.h" 
#include <QList> 
#include <QMetaMethod> 
#include <unistd.h> 


Thread::Thread(A *a) 
{ 
} 
void Thread::run() 
{ 
    int i = 5; 
    while (i){ 
    qDebug()<< i; 
    sleep(2); 
    i--; 
    } 
    emit processingDone(">>> FROM THREAD"); 
    qDebug()<<"Emited signal from thread"; 
} 

void A::callA() 
{ 
    qDebug()<<"from callA"; 
    //moveToThread(thread); 
    thread->start(); 
    //thread->run(); 
    //emit signalA(">>> FROM CallA"); 
} 

void A::slotA(QString arg) 
{ 
    qDebug()<<"from sloatA "<< arg; 
} 

sample.h

class A; 
    class Thread : public QThread 
    { 
     Q_OBJECT 
    public: 
     Thread(A *a); 
     ~Thread(){ 
     qDebug()<<"Thread is destroyed"; 
     } 
     void run(); 
    signals: 
     void processingDone(QString arg); 
    }; 

    class A : public QObject{ 
    Q_OBJECT 

    public: 
     A(){ 
     qDebug()<<"Registering"; 
     thread = new Thread(this); 
     connect(thread, SIGNAL(processingDone(QString)), this, SLOT(slotA(QString))); 
     connect(this,SIGNAL(signalA(QString)), this, SLOT(slotA(QString))); 
     } 
    public slots: 
     void callA(); 
     void slotA(QString arg); 

    signals: 
     void signalA(QString arg); 

    private: 
     Thread *thread; 
    }; 

Когда я пытаюсь выполнить программу, слот не вызывается? если я поставлю moveToThraed(), тогда код будет работать, но это не послужит моим puprose. Я что-то упускаю?

ответ

8

Вы не зациклились на этом виде.

ваша главная функция должна выглядеть следующим образом:

QApplication app(argc, argv); 
A a; 
a.callA(); 
return app.exec(); 

Qt очередями соединений не может работать, если нет цикла событий работает в приемном потоке.

Когда объект приемника живет в нитке, отличной от нити, где излучается сигнал, Qt::AutoConnection использует Qt::QueuedConnection, см. docs.

A Qt::QueuedConnection работает, отправив событие в цикл событий целевой нити (поток, в котором находится приемник QObject). Когда это событие обрабатывается (по циклу события), вызов в слот вызывается в целевом потоке.

В вашем случае, основной поток всегда застрял в:

while(1) 
    sleep(1); 

Так, он никогда не будет в состоянии выполнить что-нибудь еще.

+0

я не получил вас. – Griffin

+0

Вы сохранили мой день – Griffin

+0

Выполняется ли exec в главном потоке или нет? – Griffin

0

Как @Mike говорит, вам нужно запустить основной цикл событий QT. Каждый QT приложение имеет это в их основной:

QApplication a(argc, argv); 
return a.exec(); 

В вашем случае:

int main(int argc, char **argv) 
{ 
    QApplication app(argc, argv); 
    A a; 
    a.callA(); 
    return app.exec(); 
} 
Смежные вопросы